请选择 进入手机版 | 继续访问电脑版

[C#教程] WPF自定义路由变乱 的实例教程

[复制链接]
查看115 | 回复31 | 2021-9-14 10:27:31 | 显示全部楼层 |阅读模式
目次

路由变乱 模子

传统的简单变乱 模子 中,在消息激发是将消息通过变乱 订阅的然后交给变乱 的相应者,变乱 的相应者使用 变乱 的处理器来做出相应,如许 就存在一个题目 ,用户控件内部的变乱 就不能被外界订阅,由于 变乱 的宿主必须可以或许 直接访问到变乱 的相应 者。

路由变乱 的变乱 拥有者和变乱 的相应者之间则没有直接的显式订阅关系,变乱 的拥有者则只负责激发变乱 ,变乱 将有谁相应它并不知道,变乱 的相应 者则有变乱 的监听器,针对变乱 举行 监听,当有此类变乱 传递至此变乱 相应 者就使用 变乱 处理器来相应变乱 并决定此变乱 是否继续传递。比如像上一个程序中的,点击“点我”以后变乱 就开始激发了,然后变乱 就会在控件树上举行 传递,变乱 的相应 者安装了监听器,当监听到这个变乱 举行 相应 ,并决定这个变乱 是否继续传递。

相识 了路由变乱 后,这节来学习一下怎样 自定义路由变乱 。

【分析代码】

在演示代码前,我们不妨先看一段Button按钮的Click路由变乱 源码,从源码中学习一下怎样 定义路由变乱 。

在ButtonBase中,跟Click路由变乱 干系 的有如下到处 代码:

代码一

WPF自定义路由变乱
的实例教程

代码二

WPF自定义路由变乱
的实例教程

代码三

WPF自定义路由变乱
的实例教程

代码四

WPF自定义路由变乱
的实例教程

第一段是声明白 ClickEvent这一起 由变乱 对象,这个不用多说;

第二段是声明白 ClickEvent路由变乱 对象的包装器,它类似 于属性的get,set,方便我们从外部把路由变乱 的处理器附加到路由变乱 上。当外部举行 “+=”操作时,内部就会实验 add块,将变乱 处理附加到Click路由变乱 上,反之实验 “-=”操作时,会实验 remove块中的内容;

第三段是构造方法中构建Click路由变乱 对象,跟创建依赖 对象类似 的是,路由变乱 对象的创建也不是直接new,而是通过EventManager类的RegisterRoutedEvent方法举行 注册,该方法第一个参数是路由变乱 的名称,微软约定路由变乱 名称要跟路由变乱 对象的包装器名称划一 ,并且跟路由变乱 对象去掉Event后缀的字样也要划一 。第二个参数是指路由变乱 的策略,也就是变乱 传播的情势 ,有如下三种摆列 :

  • RoutingStrategy.Tunnel:隧道式,是指变乱 从最外层的控件开始路由,直到路由到控件本身 ,就像一条自上往下的隧道,从window控件一起 通到当前触发变乱 的控件;
  • RoutingStrategy.Bubble:冒泡式,这个跟隧道式相反,它是从触发变乱 的控件向上传播,直到最上层制止 ;
  • RoutingStrategy.Direct:直通式,跟原始变乱 模子 一样,不路由,直达变乱 处理器。

第三个参数是指定该路由变乱 的变乱 处理器是什么范例 ,第四个参数是指定该路由变乱 对象的宿主范例 ,第四个参数跟第一个参数共同用于路由变乱 对象的内部创建使用 :构建hash code,确定路由变乱 对象唯一性,同依赖 属性划一 ,在一个类中不能注册两个同名的路由变乱 对象。

第四段是激发Click路由变乱 的方法,变乱 参数就是在此方法中处理,它是路由变乱 传播之源。

【自定义路由变乱 】

下面我们就来根据以上语法,基于ButtonBase创建本身 的Click路由变乱 :

  1. public class MyRoutedEventArgs : RoutedEventArgs
  2. {
  3. public MyRoutedEventArgs(RoutedEvent routedEvent, object source)
  4. : base(routedEvent, source) { }
  5. public string RoutedMessage { get; set; }
  6. }
  7. public class MyButton : ButtonBase
  8. {
  9. public static readonly RoutedEvent MessageEvent =
  10. EventManager.RegisterRoutedEvent("Message", RoutingStrategy.Bubble,
  11. typeof(EventHandler<MyRoutedEventArgs>), typeof(MyButton));
  12. public event RoutedEventHandler Message
  13. {
  14. add { this.AddHandler(MessageEvent, value); }
  15. remove { this.RemoveHandler(MessageEvent, value); }
  16. }
  17. protected override void OnClick()
  18. {
  19. base.OnClick();
  20. MyRoutedEventArgs eventArgs = new MyRoutedEventArgs(MessageEvent, this)
  21. { RoutedMessage = "自定义路由事件被触发了" };
  22. this.RaiseEvent(eventArgs);
  23. }
  24. }
复制代码

上述代码中,我创建了一个MyButton,声明白 一个MessageEvent路由变乱 对象,值得留意 的是,RegisterRoutedEvent的第三个参数我用的是:

typeof(EventHandler)

而非:

typeof(RoutedEventHandler)

由于 RoutedEventHandler的参数跟我自定义的变乱 参数不划一 ,必要 使用 EventHandler的泛型版指定我的变乱 参数范例 ,下面是RoutedEventHandler的声明:

WPF自定义路由变乱
的实例教程

该参数范例 是RoutedEventArgs,而我使用 的是自定义的MyRoutedEventArgs范例 。

XAML部分及变乱 处理器的代码为:

WPF自定义路由变乱
的实例教程

在外层Grid上设置MyButton的Message变乱 监听及处理器。

运行结果 如下:

WPF自定义路由变乱
的实例教程

点击“你好”,弹出MessageBox提示“自定义路由变乱 被触发了”。

总结

到此这篇关于WPF自定义路由变乱 的文章就先容 到这了,更多干系 WPF自定义路由变乱 内容请搜索 脚本之家从前 的文章或继续欣赏 下面的干系 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 制菜参力 | 2021-9-16 19:57:25 | 显示全部楼层
admin楼主说的我也略懂!
回复

使用道具 举报

avatar 碧雲居士 | 2021-9-18 22:40:23 | 显示全部楼层
admin楼主的头像是本人吗?
回复

使用道具 举报

avatar 人民看看2014 | 2021-9-24 09:07:34 | 显示全部楼层
顶顶更健康!
回复

使用道具 举报

avatar 崔炫俊献 | 2021-10-12 09:01:15 | 显示全部楼层
不是惊喜,是惊吓!
回复

使用道具 举报

avatar 计儿坏 | 2021-10-13 07:09:24 | 显示全部楼层
骂人也是要有水平的!
回复

使用道具 举报

avatar 们至熟两创 | 2021-10-14 07:39:33 | 显示全部楼层
不错哦,admin楼主这是要火的节奏啊!
回复

使用道具 举报

avatar 日啊驴吗厩 | 2021-10-14 13:10:09 | 显示全部楼层
很给力!
回复

使用道具 举报

avatar 123457191 | 2021-10-15 10:45:10 | 显示全部楼层
顶!顶!顶!
回复

使用道具 举报

avatar 保佑缎 | 2021-10-15 22:52:34 | 显示全部楼层
顶顶更健康!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则