用途:本技能资料讲解 WPF 路由事件系统,帮助理解并实现事件在元素树中的传播,适用于创建自定义路由事件、处理事件传播或控制事件冒泡与隧道。
主要能力:
- 路由策略:隧道(Tunneling,根到源,PreviewXxx 命名,用于输入校验与提前取消)、冒泡(Bubbling,源到根,常规事件处理)、直接(Direct,仅源,如 MouseEnter、MouseLeave)。
- 传播顺序:以按钮点击为例,先执行 Window、Grid、Button 的 PreviewMouseDown(隧道),再执行 Button、Grid、Window 的 MouseDown(冒泡)。
- 停止传播:设置 e.Handled = true 可阻止后续传播;使用 AddHandler 并传 handledEventsToo: true 可接收已被标记处理的事件。
- RoutedEventArgs 属性:Source(逻辑树中引发事件的元素)、OriginalSource(视觉树中实际点击的元素)、RoutedEvent、Handled。
- 自定义路由事件:通过 EventManager.RegisterRoutedEvent 注册,指定 name、routingStrategy、handlerType、ownerType,并提供 CLR 事件包装(add/remove 调用 AddHandler/RemoveHandler),用 RaiseEvent 触发;可自定义 RoutedEventArgs 子类携带数据。
- 类事件处理器:在静态构造函数中用 EventManager.RegisterClassHandler 注册,先于实例处理器调用,作用于该类型所有实例。
- 附加事件:可在父级(如 Grid)用 Button.Click 处理子按钮冒泡事件;也可定义附加路由事件并提供 Add/Remove 处理器方法。
- 常见模式:在父级聚合多个子元素事件并按 OriginalSource 类型分派;按条件设置 e.Handled 抑制事件。
使用方式:在 XAML 中为元素挂接 PreviewXxx 与 Xxx 事件处理器,在代码后置中按顺序处理;自定义事件需注册、包装、触发三步。
限制:资料未提供具体版本要求、性能数据或完整项目配置说明;示例基于 .NET WPF,需在 WPF 项目中使用。