Wpf 什么是路由事件以及它与正常事件的区别
如果有人能用一个简单的例子来解释,我将不胜感激。想象一个窗口包含密集的子控件层次结构。现在让我们假设你想做点什么,在你的窗口的任何地方都有一个右键点击 对于普通事件,您必须处理所有控件的单击事件,因为您不确定用户可能单击的位置。 对于WPF,事件要么是气泡式的,要么是隧道式的,也就是说,如果找不到在当前级别处理它的事件处理程序,事件就会沿着UI树向上移动,或者向下移动。因此,您可以为窗口的事件编写一个处理程序,即TopLevel。WPF有一个事件对的约定,PreviewXXX和XXX-PreviewXXX事件首先触发,并从根目录向下传递到接收刺激的控件,然后对应的XXX事件从子控件返回根目录。因此,如果右键单击某个按钮,WPF将沿着UI层次结构向上移动,调用它找到的所有处理程序,除非有人在事件参数中标记事件已处理。Wpf 什么是路由事件以及它与正常事件的区别,wpf,Wpf,如果有人能用一个简单的例子来解释,我将不胜感激。想象一个窗口包含密集的子控件层次结构。现在让我们假设你想做点什么,在你的窗口的任何地方都有一个右键点击 对于普通事件,您必须处理所有控件的单击事件,因为您不确定用户可能单击的位置。 对于WPF,事件要么是气泡式的,要么是隧道式的,也就是说,如果找不到在当前级别处理它的事件处理程序,事件就会沿着UI树向上移动,或者向下移动。因此,您可以为窗口的事件编写一个处理程序,即TopLevel。WPF有一个事件对的约定,PreviewXXX和XXX-Previ
路由事件是具有更多“旅行能力”的事件,如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有点生锈了。谢谢你的更正。。。更新。