【学习笔记】Silverlight框架:Jounce(4)——事件通信
Prism、CM和Jounce里都有各自的事件通信机制,也都叫EventAggregator。
相比于Prism,Jounce里的EventAggregator的风格更接近CM。当然作者也是这么说的:The pattern here is based on the lightweight version Rob Eisenburg introduced with Caliburn Micro。
这里涉及的类主要有三个:两个接口类IEventAggregator和IEventSink<in T>,还有实现IEventAggregator的EventAggregatorService。
IEventAggregator定义了四个方法,其中三个是订阅消息、在UI线程上订阅消息和取消订阅,接受的参数都是IEventSink;最后一个方法是用来发布消息的。
EventAggregatorService内部维护了一个弱引用的字典用来存储订阅了消息的IEventSink,当在某个地方谁谁谁发布消息的时候,就会在这个字典里去找泛型类型匹配的IEventSink并调用其唯一的一个方法HandleEvent。
其实就是观察者,你懂的。
来实例操作下,通过模板新建解决方案,整个结构如下:
MainPage分为左右2个部分,分别用来存放PublishIntSubscribeGuid和PublishGuidSubscribeInt。
PublishIntSubscribeGuid会发布Int值,然后接收Guid的消息。
PublishGuidSubscribeInt会发布Guid,然后接收Int值的消息。
两个页面都是上面一个按钮,下面一个TextBox用来显示收到的消息,后台代码也差不多,我们来看看其中一个:
[Export]public partial class PublishIntSubscribeGuid : UserControl, IEventSink<Guid>, IPartImportsSatisfiedNotification{[Import]public IEventAggregator EventAggregator { get; set; }public PublishIntSubscribeGuid(){InitializeComponent();this.PublishButton.Click += new RoutedEventHandler(PublishButton_Click);}void PublishButton_Click(object sender, RoutedEventArgs e){var random = new Random();this.EventAggregator.Publish(random.Next());}#region IPartImportsSatisfiedNotification 成员public void OnImportsSatisfied(){EventAggregator.SubscribeOnDispatcher(this);}#endregion#region IEventSink<Guid> 成员public void HandleEvent(Guid publishedEvent){this.OutTextBox.Text += "\r\n" + publishedEvent;}#endregion}
首先,要订阅Guid类型的消息先要实现IEventSink接口,泛型类型是Guid。
然后,要实现IPartImportsSatisfiedNotification接口,在MEF导入IEventAggregator后,注册完成消息订阅(这里在UI线程上订阅),这样当有某个地方发布类型是GUID的消息时,HandleEvent(Guid publishedEvent)方法就会最终被调用。
另外,在点击发布消息的按钮时候发布个随机的Int值,当某个地方订阅了Int类型的消息时,那个地方就会接收到这个随机值。
实际应用可能要复杂点,泛型会是某个实体类或者某种错误等等。
看一下效果:
代码:这里
PS:
1.打开APP.CS,可以看到通过模板创建的解决方案默认使APP实现了 IEventSink<UnhandledExceptionEvent>接口,这个就是原来通过Application.Current.UnhandledException注册的系统未处理错误,Jounce在ApplicationService里进行了注册和转换并通过事件系统进行了发布。这样就可以在别的地方也进行侦听。
2.整个事件通信系统是Jounce页面加载和导航的基础,可以实现IEventSink<ViewNavigationArgs>并侦听下看看。
转载于:https://www.cnblogs.com/HalfwayMonk/archive/2011/07/28/2120465.html
【学习笔记】Silverlight框架:Jounce(4)——事件通信相关推荐
- Unity游戏框架学习笔记——03基于观察者模式的事件中心
Unity游戏框架学习笔记--03基于观察者模式的事件中心 基于观察者模式的事件中心 一如既往指路牌:https://www.bilibili.com/video/BV1C441117wU?p=5. ...
- SilverLight学习笔记--Silverlight之数据绑定初探
数据绑定(Data Binding)是用户界面UI和业务对象或其它数据提供者(data provider)的连接.用户界面对象称为目标,数据提供者成为数据源. 数据绑定帮助隔离应用程序的用户界面层 ...
- libevent学习笔记六:libevent核心事件event
libevent学习笔记六:libevent核心事件event 前面对reactor模式.事件处理流程.libevent源代码结构等有了高层的认识后,接下来将详细介绍libevent的核心结构even ...
- 软件调试学习笔记(三)—— 调试事件的处理
软件调试学习笔记(三)-- 调试事件的处理 要点回顾 调试事件的处理 实验一:实现简单调试器(创建进程) 实验二:分析异常来源 实验三:实现简单调试器(附加进程) 实验四:分析NtDebugActiv ...
- 软件调试学习笔记(二)—— 调试事件的采集
软件调试学习笔记(二)-- 调试事件的采集 要点回顾 调试事件的种类 调试事件采集函数 例:分析PspUserThreadStartup 例:分析PspExitThread 总结 要点回顾 调试器与被 ...
- jQuery学习笔记之DOM操作、事件绑定(2)
jQuery学习笔记之DOM操作.事件绑定(2) --------------------学习目录------------------------ 4.DOM操作 5.事件绑定 源码地址: https ...
- ROS学习笔记(八): ROS通信架构
ROS学习笔记(八): ROS通信架构 文章目录 01 Node & Master 1.1 Node 1.2 Master 1.3 启动master和node 1.4 rosrun和rosno ...
- 开源鸿蒙南向嵌入学习笔记——NAPI框架学习(一)
开源鸿蒙南向嵌入学习笔记--NAPI框架学习(一) 前言--系列介绍 本系列文章主要是记录笔者在鸿蒙南向的学习与工作中的知识点笔记记录,其中不止会针对鸿蒙中的学习问题进行思考与记录,也会对涉及到的一些 ...
- 免费学习机器学习和深度学习的源码、学习笔记和框架分享
机器学习和深度学习的免费学习源码.学习笔记和框架分享 python笔记 源码 python导入模块的的几种方式 在python中,字典按值排序 python中set的基本常用方法 python取出fr ...
- Vue学习笔记05 组件的自定义事件-组件通信-$nextTick-脚手架解决ajax跨域-插槽-过渡动画
文章目录 Vue学习笔记05 父组件给子组件传值 注意点 子组件给父组件传值 父组件接受子组件的传值 通过函数 组件的自定义事件 事件绑定的第一种写法 @或v-on 事件绑定的第二种写法:使用ref ...
最新文章
- P多行溢出省略号的处理
- 把一张合成图分拆出各个小图
- React-Router4按需加载
- EDA实验课课程笔记(六)——NC-verilog的介绍与使用(二)
- verilog系统任务之$random
- Apache+php+mysql在windows下的安装与配置图解之apache篇
- 求小球落地5次后所经历的路程和第5次反弹的高度
- 解构CPU--从晶体管到门电路
- PAT-求特殊方程的正整数解(简单编程题)
- meaven install提示系统资源不足
- 计算机如何删除桌面是的视频,Win10怎么彻底删除此电脑中的文档视频音乐文件夹[多图]...
- Python的Code对象
- 互联网理财系统开发-满足投资人随投随取、多种产品、多种选择、风险更小、收益更多
- python将一个组数分成几个相同元素的数组,末位少了不补齐
- 对View的onMeasure方法理解
- [2021年12月31日] 今天得到了19年开发老兵的感悟/职场的认知,你必须要看一看了
- 值得推荐的几部日本电影(一)
- 深圳Java培训学习:SpringBoot的yml配置及多环境切换【千锋】
- 微信小程序云开发实现上传文件和预览下载文件
- 小程序使用 Antv F2的报错chart.pieLabel is not a function解决办法