专栏首页小黎子数据分析WPF自学入门(四)WPF路由事件之自定义路由事件

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中,设计如下:

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

运行效果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • WPF自学入门(三)WPF路由事件之内置路由事件

    有没有想过在.NET中已经有了事件机制,为什么在WPF中不直接使用.NET事件要加入路由事件来取代事件呢?最直观的原因就是典型的WPF应用程序使用...

    黄昏前黎明后
  • C1WPF制作OLAP Cube浏览工具

    经过前期一段时间对WPF的学习了解,相信大家对WPF有了一定的了解。今天我们一起来了解使用Component One(简称C1)的WPF控件制作C...

    黄昏前黎明后
  • WPF自学入门(十二)WPF MVVM模式提取函数

    我们平时在写代码时为了不重复写代码,会进行复制代码或者写通用方法。今天我们就来把上传做的函数提取成为通用的方法调用。把上次写的函数提取为两个主要的文...

    黄昏前黎明后
  • ASP.NET的路由系统:路由映射

    总的来说,我们可以通过RouteTable的静态属性Routes得到一个基于应用的全局路由表,通过上面的介绍我们知道这是一个类型的RouteCollection...

    蒋金楠
  • Dart服务器端 shelf_route包 原

    简而言之,如果你想构建自己的堆栈,那么shelf_route和shelf_rest可能会更适合你。 如果你想要一个功能更全面的框架,同时仍然具有高度可扩展性,那...

    南郭先生
  • django路由基本使用-6

    django的路由是定义在 urls.py 文件下的 urlpatterns 列表中的。 urls.py 文件是路由解析的入口。

    py3study
  • Linux 之 crontab 使用

    crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要...

    用户5807183
  • 看过太多BAT大厂面试题,其实考的无非是这几点能力

    发现一个有趣的现象,网上一些比较热门的文章、博客往往都是“某某公司面试题汇总”、“某某公司面试题解析”,似乎程序员们对面试题总是抱有热情,好像多看了几道面试题,...

    乔戈里
  • Linux 之 crontab 使用

    crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要...

    Spark学习技巧
  • 云数据库MySQL CPU飙升排查流程

    在日常使用MySQL的过程中,会遇到 CPU 使用率过高甚至达到 100% 的情况。CPU飙升会导致数据库无法连接,事务无法提交等一系列问题。本文基于日常问题处...

    苏欣

扫码关注云+社区

领取腾讯云代金券