所谓的潇洒

导航

WPF知识点备忘录——依赖项属性、路由事件

1.依赖项属性

  定义:在普通属性上封装了些专门用于实现WPF功能的属性

  public static readonly DependencyProperty MarginProperty;

  public Thickness Margin

  {

    get { return (Thickness)GetValue(MarginProperty); }

    set { SetValue(MarginProperty, value); }

  }

  注册:

  static FrameworkElement()

  {

    FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(

      new Thickness() , FrameworkPropertyMetadataOptions.AffectsMeasure);

    MarginProperty = DependencyProperty.Register("Margin",

      typeof(Thickness), typeof(FrameworkElement), metadata,

      new ValidateValueCallback(FrameworkElement.IsMarginValid));

  }

  共享依赖项属性:

    例如,TextElement.FontFamily属性,在TextBlock和Control类的静态构造函数中通过DependentcyProperty.AddOwner()得到共享,

  改变其中一个,另一个也收到影响。

  附加依赖项属性:

    例如,Grid的Row和Column,DockPanel的Dock,Canvas的Left、Right、Top、Bottom

2.路由事件

  定义:可以在元素树上冒泡或隧道传播,并且沿着传播路径被处理程序处理的事件。

  public abstract class ButtonBase : ContentControl,...

  {

    public static readonly RoutedEvent ClickEvent;

    static ButtonBase()

    {

      ButtonBase.ClickEvent = EventManager.RegisterRoutedEvent(

        "Click" , RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ButtonBase));

      ...

    }

    public event RoutedEventHandler Click

    {

      add

      {

        base.AddHandler(ButtonBase.ClickEvnet , Value);

      }

      remove

      {

        base.RemoveHandler(ButtonBase.ClickEvent , value);

      }

    }

    ...

  }

  分类

    直接路由事件: 不传递给其他元素,例如 MouseEnter

    冒泡路由事件: 由子元素向父级的方向传递例如 MouseDown

    隧道路由事件: 由父级元素向子级方向传递例如 PreviewKeyDown

posted on 2023-02-24 11:51  所谓的潇洒  阅读(74)  评论(0编辑  收藏  举报