如何使用Prism框架的EventAggregator在模块间进行通信
目的
本文主要介绍如何使用Prism类库提供的事件机制在松耦合组件之间相互通信,Prism类库的事件机制建立在事件聚合服务之上,允许发布者和订阅者通过事件进行通信,不需要彼此之间引用。
事件聚合
EventAggregator提供了多点传送发布/订阅功能。这意味着可能有可以触发同一事件多个发布者和可以监听同一事件的订阅者。
使用方法
事件参数类
using Microsoft.Practices.Prism.Events; /// <summary>
/// 定义事件,切换主题
/// </summary>
public class ChangeSystemThemeEvent : CompositePresentationEvent<string> { }
注意:
事件参数类是各模块间共享的,需要将其定义在一个公共的位置。
事件参数类需要继承CompositePresentationEvent<TPayload> ,其中TPayLoad为参数类型,注意类的实现是空的。
发布事件
using Microsoft.Practices.ServiceLocation;
using Microsoft.Practices.Prism.Events; // 发布 改变系统主题事件
ServiceLocator.Current.GetInstance<IEventAggregator>().GetEvent<ChangeSystemThemeEvent>().Publish("主题名称");
订阅事件
CompositePresentationEvent类提供了多个重载的Subscribe方法来订阅事件,例子中使用了最基本的订阅事件的版本。
using Microsoft.Practices.Prism.Events; //订阅 改变系统主题事件
SubscriptionToken eventToken= ServiceLocator.Current.GetInstance<IEventAggregator>().GetEvent<ChangeSystemThemeEvent>().Subscribe(ChangeThemeEvent); /// <summary>
/// 切换主题
/// </summary>
void ChangeThemeEvent(string theme)
{
// TODO:切换系统主题处理逻辑
// Step 1.
// Step 2.
// Step 3.
}
注意:
1. 在使用Subscribe方法订阅事件时,可以使用ThreadOption 参数指定接受事件的线程。
ThreadOption可以使用:
PublisherThread.使用这个设置,在发布者进程中接收事件,这是默认设置。
BackgroundThread. 使用这个设置在.NET Framework线程池中异步接收事件。
UIThread. 使用这个设置在UI线程接收事件。
2. Subscibe方法返回一个SubscriptionToken类型的订阅标识,它可以在后面用于移除订阅事件。
3. 默认情况下,事件订阅为弱引用订阅,如果在短时间内引发多个事件并且关心其性能时,可以订阅强引用事件。在Subscribe方法中将keepSubscriberReferenceAlive参数设置为True即可实现强引用事件。如果使用了强引用,订阅者需要能够在当订阅对象不在使用时去掉订阅并正确的回收它。
4. 订阅事件时也可以通过使用filter参数来筛选是否处理发布者的事件,filter参数是System.Predicate<TPayLoad>类型。
取消订阅事件
如果订阅者不在想要接收事件,可以通过订阅者的处理逻辑来取消订阅也可以通过使用一个订阅标识来取消订阅。
using Microsoft.Practices.ServiceLocation;
using Microsoft.Practices.Prism.Events; // 取消订阅事件
ServiceLocator.Current.GetInstance<IEventAggregator>().GetEvent<ChangeSystemThemeEvent>().Unsubscribe(eventToken);
如何使用Prism框架的EventAggregator在模块间进行通信的更多相关文章
- Prism之使用EventAggregation进行模块间通信
在开发Silverlight程序的时候,经常需要在不同的组件间进行通信.比如点击一个button,可能就需要改变另一个控件的内容.比较直接的办法是使用事件,当然使用MVVM的时候也可以使用comman ...
- 转--HC05-两个蓝牙模块间的通信
示例蓝牙: 蓝牙A地址:3014:10:271614 蓝牙B地址:2015:2:120758 //============================================= 步骤: 1 ...
- iframe框架子页面与父页面间的通信
需要注意的问题:页面最好放在服务器上测试避免跨域问题. 具体参考:http://www.cnblogs.com/ljhero/archive/2011/07/09/2101540.html
- 在Prism 框架中,实现主程序与模块间 UI 的通信
背景: 在模块的UI中包含 TreeView 控件,在该树形控件的每一节点前面定义了一个复选框,如图 需求: 在两个不同的应用程序中使用该控件,而它在不同应用程序中的外观则并不一致,按照本例,即一个显 ...
- WPF Step By Step 系列-Prism框架在项目中使用
WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Pr ...
- Prism for WPF再探(基于Prism事件的模块间通信)
上篇博文链接 Prism for WPF初探(构建简单的模块化开发框架) 一.简单介绍: 在上一篇博文中初步搭建了Prism框架的各个模块,但那只是搭建了一个空壳,里面的内容基本是空的,在这一篇我将实 ...
- 项目中使用Prism框架
Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Prism框架来构建基础的应用框架,并且 ...
- Prism框架在项目中使用
本文大纲 1.Prism框架下载和说明 2.Prism项目预览及简单介绍. 3.Prism框架如何在项目中使用. Prism框架下载和说明 Prism框架是针对WPF和Silverlight的MVVM ...
- Prism框架的Module(模块化)编程
Prism框架用的是新版本的,Prism7.1.关于其中的变动,感兴趣的参考https://www.cnblogs.com/hicolin/p/8694892.html 如何告诉Shell(我们的宿主 ...
随机推荐
- Cstring获取第N个字符
void CTestaDlg::GetCStringItemAt(CString strin,CString & strout,int nindex) { ); ; ]={'\0'}; whi ...
- 必须得是一万小时的 刻意训练(deliberate practice)
成功素质1:一万小时与格物致知 “格物致知14”的概念,我是从张银奎11老师那里了解到的.它的意思是“推究事物的原理,从而获得知识”,跟我在<透过现象看本质 - 写在观看WWDC 2016 Ke ...
- Box.net获5000万美元投资(SAAS博士)
9月29日,据国外媒体报道,“云”存储服务商Box.net已经从Salesforce等投资者获得新一轮融资5000万美元. Box.net过去的投资者也参与了新一轮的融资.最终,在CRM巨人Sales ...
- telnet 不是内部或外部 命令
win7->程序和功能->打开或关闭Windows功能->找到telnet安装下
- C#模拟网站用户登录
我们在写灌水机器人.抓资源机器人和Web网游辅助工具的时候第一步要实现的就是用户登录.那么怎么用C#来模拟一个用户的登录拉?要实现用户的登录,那么首先就必须要了解一般网站中是怎么判断用户是否登录的. ...
- Android基础&进阶
http://blog.csdn.net/liuhe688/article/details/9494411
- unity4.x for mac破解(含Unity全版本号破解)
声明,破解方式及工具,均来源于国外互联网.仅供交流学习使用! 国外一个大仙做的破解.这位大侠实在是牛,全版本号跟进,win和mac的破解包都有.win下有类似于注冊机的Patch,mac下有crack ...
- Oracle监听静态注册和动态注册
静态注册和动态注册总结 一.什么是注册? 注册就是将数据库作为一个服务注册到监听程序.客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库.这个服务名可能与实例名 ...
- 适用于CSS2的各种运动的javascript运动框架
<script> window.onload = function() { //var oDiv1 = document.getElementById('box1'); //var oDi ...
- js如何关闭当前页,而不弹出提示框
//关闭当前页面,并且打开新页面,(不提示) function closeWinAndOpen(url) { //利用随机数处理WinName var sWinName = "LR" ...