WPF自学入门WPF路由事件之自定义路由事件

Posted 黄昏前黎明后

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF自学入门WPF路由事件之自定义路由事件相关的知识,希望对你有一定的参考价值。

       在上一篇博文中写到了内置路由事件,其实除了内置的路由事件,我们也可以进行自定义路由事件。接下来我们一起来看一下WPF中的自定义路由事件怎么进行创建吧。

创建自定义路由事件分为3个步骤:

1、声明并注册路由事件。

2、利用CLR事件包装路由事件(封装路由事件)。

3、创建可以激发路由事件的方法。

      现在我们一起创建一个能够报告当前时间和当前位置信息的路由事件,一起去控件里面游览一番。现在开始创建自定义路由事件

 一、声明自定义路由事件

       创建继承RoutedEventArgs类的派生类ReportCurrentLocationEventArgs用来携带时间和位置消息,ClickTime属性是用来存储时间,CurrentLocation属性是用来存放位置

 

二、定义注册路由事件

       我们用EventManager.RegisterRoutedEvent方法来注册的参数有4个。代码如下:

 public static readonly RoutedEvent ReportCurrentLocationEvent =EventManager.RegisterRoutedEvent

                ("ReportCurrentLocation", RoutingStrategy.Bubble, typeof(EventHandler<ReportCurrentLocationEventArgs

     >), typeof(ButtonReportCurrentLocation));

      第一个参数是路由事件的名称Name。

      第二个参数是路由事件的传递方式,有三种方式:

            第一种是Bubble是冒泡模式,这种模式是从触发点向上传递,知道最外层。

             第二种是Direct就是传统的事件一样的,不会通过元素树。

            第三种是Tunnel是预览模式(隧道模式),这和冒泡的相反,向下传递。

     第三个参数是路由事件处理器类型,传递的参数是自定义类。

     第四个参数是拥有这个路由事件的类型。

 

三、封装路由事件

      CLR事件的封装器,不同于依赖属性的GetValue和SetValue,这里是利用Add和Remove两个函数来给路由事件分配事件处理器。

 public event RoutedEventHandler ReportCurrentLocation

            {

                add { this.AddHandler(ReportCurrentLocationEvent, value); }

                remove { this.RemoveHandler(ReportCurrentLocationEvent, value); }

            }

四、创建可以激发路由事件的方法

     重写OnClick方法触发设定路由事件,这是使用RaiseEvent()方法来触发

 protected override void OnClick()

            {

                base.OnClick();

                ReportCurrentLocationEventArgs args = new ReportCurrentLocationEventArgs(ReportCurrentLocationEvent, this);

                args.ClickTime = DateTime.Now;

                this.RaiseEvent(args);

            }

 

完整代码如下图:

 

在界面XAML中,设计如下:

 

 

那么最后看一下事件处理器是怎样的

 

运行效果:

 

以上是关于WPF自学入门WPF路由事件之自定义路由事件的主要内容,如果未能解决你的问题,请参考以下文章

WPF自学入门WPF路由事件之内置路由事件

WPF效果第二百零四篇之自定义更新控件

WPF 自定义路由事件问题

WPF的路由事件冒泡事件隧道事件(预览事件)

WPF--路由事件

WPF 自定义一个控件,当点击按钮是触发到ViewModel(业务逻辑部分)和Xaml路由事件(页面逻辑部分)