WPF:路由事件还是常规事件?

标签 wpf events routed-events

在 WPF 中,我们有路由事件。什么时候应该使用这些来代替常规事件?

最佳答案

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

如果您使用任何建议的场景,路由事件变得强大的地方:在公共(public)根中定义公共(public)处理程序,合成您自己的控件,或定义您自己的自定义控件类。

路由事件监听器和路由事件源不需要在其层次结构中共享公共(public)事件。任意 UIElementContentElement可以是任何路由事件的事件监听器。因此,您可以将整个工作 API 集中可用的全套路由事件用作概念“接口(interface)”,从而应用程序中的不同元素可以交换事件信息。这种用于路由事件的“接口(interface)”概念特别适用于输入事件。

路由事件也可用于通过元素树进行通信,因为事件的事件数据被永久保存到路由中的每个元素。一个元素可以更改事件数据中的某些内容,并且该更改将可用于路由中的下一个元素。

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

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

  • 来源:MSDN: Routed Events Overview

    关于WPF:路由事件还是常规事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/816392/

    相关文章:

    c# - 绑定(bind)Command时绑定(bind)IsEnabled是可选的吗?

    wpf - 禁用对禁用 TextBox 的验证

    windows - Control.Enter 和 Control.GotFocus 事件有什么区别?

    c# - 如何从子窗口处理路由事件

    wpf - WPF 中的路由事件 - 使用操作委托(delegate)

    wpf - 如何将 ApplicationCommands 绑定(bind)到 ViewModel?

    c# - 为什么 View 构造函数被调用两次?

    JQuery MouseUp 报告 CHILD 元素

    javascript - 捕获脚本生成的 mailto URI

    c# - 路由事件语法