路由事件是什么,它与普通事件有何不同?

14

如果有人能用简单的例子来解释一下,我会很感激。

2个回答

23
假设有一个包含大量子控件的窗口。现在假设你想要做某些事情,比如说在窗口的任何位置右键单击。
使用普通事件,你必须处理所有控件的点击事件,因为你不确定用户可能会在哪里点击。
使用WPF的路由事件,如果找不到事件处理程序,则事件会“冒泡”或“隧道”(即向上或向下穿过UI树),并在当前级别上进行“处理”。因此,你可以为窗口的事件编写一个处理程序,即TopLevel。 (WPF有一种事件对的约定,即PreviewXXX和XXX - PreviewXXX事件首先触发,并从根向接收刺激的控件隧道下来,而对应的XXX事件则从子控件向上冒泡到根)。因此,如果你在按钮上右键单击,WPF会遍历UI层次结构,调用它找到的所有处理程序(除非有人在事件参数中标记事件为“已处理”)。

预览事件是隧道事件,而不是冒泡事件。 - John Bowen
1
@John -- 哎呀!我的 WPF 有点生疏了。谢谢你的纠正...已经更新了。 - Gishu

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。这是因为您可以真正将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
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接