WPF:路由事件或定期事件?

11 wpf events routed-events

在WPF中,我们已经路由了事件.应该何时使用这些而不是常规事件?

CSh*_*per 11

路由事件具有特殊行为,但如果您在引发它的元素上处理事件,则该行为在很大程度上是不可见的.

路由事件变得强大的地方是,如果您使用任何建议的方案:在公共根目录定义公共处理程序,合成您自己的控件,或定义您自己的自定义控件类.

路由事件侦听器和路由事件源不需要在其层次结构中共享公共事件.任何UIElementContentElement都可以是任何路由事件的事件侦听器.因此,您可以使用整个工作API集中可用的完整路由事件集作为概念"接口",从而应用程序中的不同元素可以交换事件信息.路由事件的这种"接口"概念特别适用于输入事件.

路由事件也可用于通过元素树进行通信,因为事件的事件数据会持续到路由中的每个元素.一个元素可能会更改事件数据中的某些内容,并且该更改可用于路径中的下一个元素.

除了路由方面之外,还有两个原因可以将任何给定的WPF事件实现为路由事件而不是标准CLR事件.如果您正在实施自己的活动,您可能还会考虑以下原则:

  • 某些WPF样式和模板功能(如EventSetterEventTrigger)要求引用的事件是路由事件.这是前面提到的事件标识符方案.
  • 路由事件支持类处理机制,该类可以指定在任何已注册的实例处理程序可以访问它们之前有机会处理路由事件的静态方法.这在控件设计中非常有用,因为您的类可以强制执行事件驱动的类行为,这些行为不能通过处理实例上的事件而被意外抑制.

来源:MSDN:路由事件概述