理解路由事件
Contents
路由事件具有更强传播能力——可在元素树向上冒泡和乡下隧道传播,并且沿着传播路径被事件处理程序处理。
利用事件路由,来自工具栏按钮的单击事件可在被代码处理之前上传到工具栏,然后上传到包含工具栏的窗口。
定义、注册和封装路由事件
和依赖项属性一样,路由事件由只读的静态字段表示。在静态构造函数中注册,并通过标准的.net事件定义进行封装
public abstract class ButtonBase:ContentControl,...
{
public static readonly RouteEvent ClientEvent;
static ButtonBase()
{
ButtonBase.ClientEvent=EventManager.RegisterRouteEvent("Click",RoutingStategy.Bubble,typeof(RouteEventHandler),typepof(ButtonBase));
...
}
public event RouteEventHandler Click
{
add
{
base.AddHandler(Button.ClickEvent,value);
}
remove
{
base.RemoveHandler(Button.ClickEvent,value);
}
}
}
共享路由事件
可以在类之间共享路由事件的定义,
UIElement.MouseUpEvent=Mouse.MouseUpEvent.AddOwner(typeof(UIElement));
引发路由事件
不是通过传统的.Net事件封装器引发的,而是使用RaiseEvent()方法引发事件,所有元素都从UIElement类继承了该方法。
RouteEventArgs e=new RouteEventArgs(ButtonBase.ClickEvent,this);
base.RaiseEvent(e);
RaiseEvent()方法负责为每个已经通过AddHandler()方法注册的调用程序引发事件。