什么是路由事件以及它与正常事件的不同之处

时间:2010-08-04 11:37:40

标签: wpf

如果有人能用一个简单的例子来解释,我将不胜感激。

2 个答案:

答案 0 :(得分:20)

想象一个包含密集的子控件层次结构的窗口。现在让我们假设您想要做某事,在窗口的任何地方都可以右键单击。

  • 对于正常事件,您必须为所有控件处理Click事件,因为您不确定用户可能会点击的位置。
  • 使用WPF的routed events,事件要么“冒泡”或“隧道”(即沿着UI树向上移动),如果他们没有找到事件处理程序,它会在当前级别“处理”它。所以你可以为窗口的事件编写一个处理程序,即TopLevel。 (WPF有一个事件对的约定,PreviewXXX和XXX - PreviewXXX事件首先触发并从根向隧道向下控制接收刺激,对应的XXX事件然后从子控制回升到Root)。因此,如果您右键单击一个按钮,WPF会向上移动UI层次结构,调用它找到的所有处理程序(除非有人在事件args中标记该事件已“处理”。)

答案 1 :(得分:1)

路线事件是具有更多“旅行能力”的事件,如 Gishu的答案中所述。路由事件由RoutedEvent类+普通.NET事件的实例表示,它包装它:

    public class MyClassWithARoutedEvent : UIElement
    {
        public static readonly RoutedEvent DoSomethingEvent;

        public event RoutedEventHandler DoSomething
        {
            add { base.AddHandler ( MyClassWithARoutedEvent.DoSomethingEvent, value );
            remove { base.AddHandler ( MyClassWithARoutedEvent.DoSomethingEvent, value );
        }
   }

在这种情况下,您通常会使用吹捧的事件:

  • 实现自己的控件,与WPF的基础架构无缝集成
  • 处理由共同根目录下的不同控件触发的事件
  • 元素树中元素之间的通信类型 在大多数情况下,您可能会使用路由事件基础结构,甚至不会注意到它。

此外值得一提的是,您可以在控件中使用RoutedEvent,即使它没有定义它,甚至可以从元素继承。那是因为您可以将RoutedEvent实例视为事件的强类型名称。因此,如果您可以访问此“名称”(这就是为什么路由事件的实例通常是公开的),您可以欠它:

public class MyClassWithARoutedEvent : UIElement
    {
        public static readonly RoutedEvent ClickEvent;
        static MyClassWithARoutedEvent  ( )
        {
          ClickEvent = ButtonBase.ClickEvent.AddOwner( typeof ( MyClassWithARoutedEvent ) );
        }

       // A wrapper should be placed here as described above
    }