功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。
实现定义:路由事件是一个 CLR 事件,可以由 RoutedEvent) 类的实例提供支持并由 Windows Presentation Foundation (WPF) 事件系统来处理。

路由事件使用

  1. 定义路由事件

    1. public class CustomButton : Button
    2. {
    3. // 路由事件的名称
    4. public const string CustomerClikcEvent = "CustomerClikcEvent";
    5. // 注册路由事件
    6. public static readonly RoutedEvent CutmoerClickEvent
    7. = EventManager.RegisterRoutedEvent(
    8. CustomerClikcEvent, // 路由事件名称
    9. RoutingStrategy.Bubble, // 路由事件类型
    10. typeof(RoutedEventHandler), // 处理时间的类型
    11. typeof(CustomButton)// 处理事件
    12. );
    13. // 路由事件的包装器
    14. public event RoutedEventHandler CustomerClick
    15. {
    16. add { this.AddHandler(CutmoerClickEvent, value); }
    17. remove { this.RemoveHandler(CutmoerClickEvent, value); }
    18. }
    19. }
  2. 处理路由事件

    1. // xaml代码绑定
    2. <local:CustomButton Content="123" CustomerClick="CustomButton_CustomerClick" MaxWidth="120" x:Name="btnCus" MaxHeight="50" Click="CustomButton_Click"></local:CustomButton>
    3. // C#代码绑定
    4. btnCus.CustomerClick += BtnCus_CustomerClick;
    5. // 事件处理的详细按钮
    6. private void CustomButton_CustomerClick(object sender, RoutedEventArgs e)
    7. {
    8. var logicTreeItem = (e.Source as UIElement).GetType();// 只到页面逻辑课看到的数据
    9. var viualTreeItem = (e.OriginalSource as UIElement).GetType();// 代表可以看到更控件的细节
    10. e.Handled = true;// 已经被处理,提供给后续事件,如果该事件已经被处理可以不再处理
    11. MessageBox.Show("CusmtomerCLick");
    12. }
  3. 引发路由事件

btnCus.RaiseEvent(new RoutedEventArgs(CustomButton.CutmoerClickEvent));// 制定要引发的路由事件,而非传统的事件触发机制

路由事件的种类

  • 冒泡Bubbles路由事件
  • 事件由激发者触发,一层一层向VisualTree的树根传递,直到Window或Page类
  • 一般的MouseDown等事件为,冒泡事件
  • 注意一般情况下button按钮的mousedown事件是不会触发的,因为Click事件已经处理了该事件,如果要触发则需要手动注册事件,并设置处理事件的标识为True

    1. btnInvokeBubble.AddHandler(Button.MouseLeftButtonDownEvent, new RoutedEventHandler((obj,e)=> { e.Handled = false; lstBublle.Items.Add(obj.GetType().ToString()); }),handledEventsToo: true);
  • Tunnel路由事件

  • 与冒泡路由事件向非,是由树根(Window或Page)向控件进行传递
  • 一般的PreviexxxxEvent为隧道事件
  • Direct路由事件
  • 等同于CLR事件,直接触发,不会进行传递例如:Click事件

    附加路由事件

    附加事件的成因是因为某些事件定义到了非UIElelement类的元素上,无法调用自带的AddHandler类来添加,则只能手动添加以下代码,以方便将该事件附加到对应的UIElelemnt元素上。
    1. // 制定要引发的路由事件,而非传统的事件触发机制
    2. btnCus.RaiseEvent(new RoutedEventArgs(CustomButton.CutmoerClickEvent));

WPF中的生命周期事件

6. 路由事件 - 图1