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

本文是《深入浅出WPF》的读书笔记,主要探讨了WPF中的事件处理机制。首先介绍了事件的基本概念,包括事件的拥有者、宿主、响应者和事件处理器。接着,阐述了直接事件模型的局限性,指出必须建立显示的订阅关系。然后,重点讲解了路由事件,包括AddHandler方法的使用以及Bubble和Tunnel两种路由策略。最后,通过ButtonBase的Click事件源代码实例来展示路由事件的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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直接事件类似,直接将事件消息传到事件处理器,不路由。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值