如何使用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(我们的宿主 ...
随机推荐
- 转载收藏之用 - 微信公众平台开发教程(六):了解MessageHandler
上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK>我们讲述了如何使用Senparc.Weixin.MP SDK ...
- cocos2d安卓android长音效播放不完全
是因为安卓限制了音效的内存,一般把mp3的比特率压缩一下.就可以搞定了.
- Tomcat 6.0.32 +Spring dbcp datasource关闭Tomcat出现严重异常
异常如下: 信息: Pausing Coyote HTTP/ -- :: org.apache.catalina.core.StandardService stop 信息: Stopping serv ...
- 开发反模式(GUID) - 伪键洁癖
一.目标:整理数据 有的人有强迫症,他们会为一系列数据的断档而抓狂. 一方面,Id为3这一行确实发生过一些事情,为什么这个查询不返回Id为3的这一行?这条记录数据丢失了吗?那个Column到底是什么? ...
- C语言中的声明解析规则——数组,指针与函数
摘要:C语言的申明存在的最大问题是:你无法以一种人们所习惯的自然方式和从左向右阅读一个声明,在引入voliatile和const关键字以后,情况更加糟糕了.由于这些关键字只能出现在声明中,是的声明形式 ...
- LCS算法思想
LCS问题就是求两个字符串最长公共子串的问题.解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0.然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的 ...
- hdu4536-XCOM Enemy Unknown(爆搜)
XCOM-Enemy Unknown是一款很好玩很经典的策略游戏. 在游戏中,由于未知的敌人--外星人入侵,你团结了世界各大国家进行抵抗.随着游戏进展,会有很多的外星人进攻事件.每次进攻外星人会选择3 ...
- POJ 2010 Moo University - Financial Aid 优先队列
题意:给你c头牛,并给出每头牛的分数和花费,要求你找出其中n(n为奇数)头牛,并使这n头牛的分数的中位数尽可能大,同时这n头牛的总花费不能超过f,否则输出-1. 思路:首先对n头牛按分数进行排序,然后 ...
- handsontable插件事件
Hook插件 afterChange (changes: Array, source: String):1个或多个单元格的值被改变后调用 changes:是一个2维数组包含row,prop,o ...
- Android学习总结——Popup menu:弹出式菜单
PopupMenu,弹出菜单,一个模态形式展示的弹出风格的菜单,绑在在某个View上,一般出现在被绑定的View的下方(如果下方有空间). 注意:弹出菜单是在API 11和更高版本上才有效的. 核心步 ...