介绍
与依赖项属性一样,路由事件是WPF对于传统.NET事件的升级,使得事件拥有更强的传播能力。
定义,注册和包装
// 我们来看一个Click事件定义的例子
public abstract class ButtonBase : ContentControl
{
// 定义路由事件
public static readonly RoutedEvent ClickEvent;
// 注册路由事件
static ButtonBase()
{
ButtonBase.ClickEvent = EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ButtonBase));
}
// 普通事件包装路由事件
public event RoutedEventHandler Click
{
add
{
// AddHandler 和 RemoveHandler都是再FrameworkElement中定义的
base.AddHandler(ButtonBase.ClickEvent, value);
}
remove
{
base.RemoveHandler(ButtonBase.ClickEvent, value);
}
}
}
共享
通过上面的定义我们可以看到,与依赖项属性一样,路由事件也是静态定义,包装为普通事件使用,那么我们自然就可以推测我们可以像依赖项属性一样,将别的类的路由事件作为己用,这里我们需要使用 RoutedEvent.AddOwner()方法。
// UIElement类添加Mouse类的MouseUp事件
UIElement.MouseUpEvent = Mouse.MouseUpEvent.AddOwner(typeof(UIElement));
使用
路由事件的引发
使用RaiseEvent方法引发路由事件
RoutedEventArgs e = new RoutedEventArgs(ButtonBase.ClickEvent, this);
base.RaiseEvent(e);
路由事件的处理
监听事件
// 在xaml中直接处理
<button Click="cmdOK_Click">OK</Button>
// 后台代码连接事件
img.MouseUp += new MouseButtonEventHandler(img_MouseUp);
// 甚至可以简化代码
img.MouseUp += img_MouseUp;
// 直接调用AddHandler方法,不通过事件包装器绑定
img.AddHandler(Image.MouseUpEvent, new MouseButtonEventHandler(image_MouseUp));
// 由于我们之前讲过的,这是一个共享事件&#x