《深入浅出WPF》读书笔记之——事件

1、LogicalTreeHelper

静态方法

说明

public static void BringIntoView(DependencyObject current);

尝试把UI元素带入视区并在目标元素触发System.Windows.FrameworkElement.RequestBringIntoView来报告结果

public static DependencyObject FindLogicalNode(DependencyObject  logicalTreeNode, string elementName);

深度遍历逻辑树子元素,根据元素名称查找元素

public static IEnumerable GetChildren(DependencyObject current)

获取直接子级元素

当前元素必须是FrameworkElement或FrameworkContentElement

public static IEnumerable GetChildren(FrameworkElement current)

获取直接子级元素

public static IEnumerable GetChildren(FrameworkContentElement  current);

获取直接子级元素

public static DependencyObject GetParent(DependencyObject  current)

或取逻辑树的直接父级对象

2、事件模型简化了消息驱动机制

  • 事件的拥有者,即消息的发送者

    • 事件的宿主可以在某些条件下激发它拥有的事件,即事件被触发

    • 事件被触发则消息被发送

  • 事件的响应者,即消息的接受者、处理者

    • 使用事件处理器(Event Handler)对事件作出响应

  • 事件的订阅关系

    • 事件实际上是一个使用event关键字修饰的委托(Delegate)类型的成员变量

    • 事件处理是一个函数

    • 类A订阅类B的事件,实际上是把A.EventHandler和B.Event关联

    • 事件被触发是B.Event被调用,此时与B.Event关联的A.EventHandler会被调用

  • 直接事件模型的弊端

    • 必须建立显示的点对点订阅关系

    • 事件的宿主必须能够直接访问事件的响应者,不然无法建立订阅关系

3、路由事件

  • 沿着VisualTree传递

  • 在逻辑树父元素添加对子元素路有事件的监听

AddHandler(Button.ClickEvent, new RoutedEventHandler((o, e) => {  }));
  • AddHandler定义在UIElement父类中

    • public void AddHandler(RoutedEvent routedEvent, Delegate  handler)

    • public void AddHandler(RoutedEvent routedEvent, Delegate  handler, bool handledEventsToo),handledEventsToo为true时,即使路由事件的e.Handled=true,也会触发当前事件处理方法

  • ButtonBase类的Click事件源代码演示如何注册一个事件

    • ClickEvent是ButtonBase的一个静态只读成员

    • Click是ButtonBase实例的一个成员,使用event关键字修饰

public static readonly RoutedEvent ClickEvent =  EventManager.RegisterRoutedEvent("Click",  RoutingStrategy.Bubble, typeof(RoutedEventHandler),  typeof(ButtonBase));

public event RoutedEventHandler Click { add {  AddHandler(ClickEvent, value); } remove {  RemoveHandler(ClickEvent, value); } }
  • 路由事件的策略

    • Bubble,冒泡式。向上路由,直到最外层容器(window或page)

    • Tunnel,隧道式。和Bubble相反,从根元素项激发事件的元素路由,类似挖了一条隧道。

    • Direct,直达式。和CLR直接事件类似,直接将事件消息传到事件处理器,不路由。

你可能感兴趣的:(WPF)