【问题标题】:What are routed events and how it's different from normal events什么是路由事件以及它与正常事件有何不同
【发布时间】:2010-08-04 11:37:40
【问题描述】:

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

【问题讨论】:

    标签: wpf


    【解决方案1】:

    想象一个包含密集的子控件层次结构的窗口。现在假设您想做某事,您可以在窗口中的任意位置单击鼠标右键。

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

    【讨论】:

    • 预览事件是隧道,而不是冒泡。
    • @John -- 哎呀!我的 wpf 有点生锈了。感谢您的更正...已更新。
    【解决方案2】:

    路由事件是具有更多“旅行能力”的事件,如 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
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 2016-12-09
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 2013-03-23
      • 2013-05-26
      相关资源
      最近更新 更多