下面我们就来根据以上语法,基于ButtonBase创建自己的Click路由事件:
public class MyRoutedEventArgs : RoutedEventArgs { public MyRoutedEventArgs(RoutedEvent routedEvent, object source) : base(routedEvent, source) { }public string RoutedMessage { get; set; } }public class MyButton : ButtonBase {public static readonly RoutedEvent MessageEvent = EventManager.RegisterRoutedEvent("Message", RoutingStrategy.Bubble, typeof(EventHandler<MyRoutedEventArgs>), typeof(MyButton));public event RoutedEventHandler Message { add { this.AddHandler(MessageEvent, value); } remove { this.RemoveHandler(MessageEvent, value); } }protected override void OnClick() { base.OnClick();MyRoutedEventArgs eventArgs =new MyRoutedEventArgs(MessageEvent, this) { RoutedMessage = "自定义路由事件被触发了" }; this.RaiseEvent(eventArgs);} }
上述代码中,我创建了一个MyButton,声明了一个MessageEvent路由事件对象,值得注意的是,RegisterRoutedEvent的第三个参数我用的是:
typeof(EventHandler<MyRoutedEventArgs>)
而非:
typeof(RoutedEventHandler)
因为RoutedEventHandler的参数跟我自定义的事件参数不一致,需要使用EventHandler的泛型版指定我的事件参数类型,下面是RoutedEventHandler的声明:
该参数类型是RoutedEventArgs,而我使用的是自定义的MyRoutedEventArgs类型。
XAML部分及事件处理器的代码为:
在外层Grid上设置MyButton的Message事件监听及处理器。
运行效果如下:
点击“你好”,弹出MessageBox提示“自定义路由事件被触发了”。