#600 – 注册一个路由事件(Registering a Routed Event)

来源:互联网 发布:卜柯文淘宝星店 编辑:程序博客网 时间:2024/06/06 16:57

当你在类中要实现一个路由事件的时候,你最终都是要创建一个RoutedEvent 类型的实例。

你创建RoutedEvent 类型的实例,其实就是间接的调用了EventManager.RegisterRoutedEvent方法。这个方法接收你想要传递的一些事件信息,并返回一个静态的RoutedEvent字段。事件通常会在静态的构造函数中或者事件声明的时候注册,所以对于你来说,到最后你只得到一个RoutedEvent,不管多少个同类型的RoutedEvent 实例被创建。

// Define/create the routed event objectpublic static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ButtonBase));

RegisterRoutedEvent 方法有下面几个参数:

 - name ——事件的名称

 - 路由策略——隧道、冒泡或者直接

 - 事件处理函数的类型——事件处理函数的委托

 - 事件拥有者的类型——拥有这个事件的类的类型

为了帮助理解路由事件在WPF中的工作方式,下面是ButtonBaseClick 事件的注册的例子。

public abstract class ButtonBase : ContentControl, ICommandSource{    // Define/create the routed event object    public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ButtonBase));     // CLR event wrapper, adds/removes handlers    public event RoutedEventHandler Click { add { AddHandler(ClickEvent, value); } remove { RemoveHandler(ClickEvent, value); } }     // Method used internally to fire the Click event    protected virtual void OnClick()    {        RoutedEventArgs newEvent = new RoutedEventArgs(ButtonBase.ClickEvent, this);        RaiseEvent(newEvent);    }}
AddHandlerRaiseEvent 方法定义在了UIElement类中。

原文地址:https://wpf.2000things.com/2012/07/11/600-registering-a-routed-event/


1 0