Wpf 什么是路由事件以及它与正常事件的区别

Wpf 什么是路由事件以及它与正常事件的区别,wpf,Wpf,如果有人能用一个简单的例子来解释,我将不胜感激。想象一个窗口包含密集的子控件层次结构。现在让我们假设你想做点什么,在你的窗口的任何地方都有一个右键点击 对于普通事件,您必须处理所有控件的单击事件,因为您不确定用户可能单击的位置。 对于WPF,事件要么是气泡式的,要么是隧道式的,也就是说,如果找不到在当前级别处理它的事件处理程序,事件就会沿着UI树向上移动,或者向下移动。因此,您可以为窗口的事件编写一个处理程序,即TopLevel。WPF有一个事件对的约定,PreviewXXX和XXX-Previ

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

想象一个窗口包含密集的子控件层次结构。现在让我们假设你想做点什么,在你的窗口的任何地方都有一个右键点击

对于普通事件,您必须处理所有控件的单击事件,因为您不确定用户可能单击的位置。 对于WPF,事件要么是气泡式的,要么是隧道式的,也就是说,如果找不到在当前级别处理它的事件处理程序,事件就会沿着UI树向上移动,或者向下移动。因此,您可以为窗口的事件编写一个处理程序,即TopLevel。WPF有一个事件对的约定,PreviewXXX和XXX-PreviewXXX事件首先触发,并从根目录向下传递到接收刺激的控件,然后对应的XXX事件从子控件返回根目录。因此,如果右键单击某个按钮,WPF将沿着UI层次结构向上移动,调用它找到的所有处理程序,除非有人在事件参数中标记事件已处理。
路由事件是具有更多“旅行能力”的事件,如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基础设施无缝集成的您自己的控制 处理由不同控件在同一根上激发的事件 元素树中元素之间的通信 在大多数情况下,您可能会使用RoutedEvents基础结构,而不会注意到它。 此外,值得一提的是,您可以在控件中使用RouteEvent,即使它没有定义它,或者甚至从元素继承,而元素定义了它。这是因为您可以将RouteEvent实例视为事件的强类型名称。因此,如果您有权访问此“名称”,这就是路由事件的实例通常公开的原因,您可以:

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
    }

预览事件是隧道,而不是冒泡。@John-Oops!我的wpf有点生锈了。谢谢你的更正。。。更新。