如何使用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);
时间: 2024-10-11 01:28:56

如何使用Prism框架的EventAggregator在模块间进行通信的相关文章

转--HC05-两个蓝牙模块间的通信

示例蓝牙: 蓝牙A地址:3014:10:271614 蓝牙B地址:2015:2:120758 //============================================= 步骤: 1.[AT模式]两个蓝牙模块的PIO11接VCC,上电后即进入AT指令模式,都用USB转TTL模块连接到电脑的USB接口. 2.[打开串口调试助手]开启2个串口调试窗口,一个打开蓝牙A的COM口,一个打开蓝牙B的COM口.[默认波特率一般为38400] 3.[恢复A默认设置]串口调试助手A,将蓝牙A恢

在Prism 框架中,实现主程序与模块间 UI 的通信

背景: 在模块的UI中包含 TreeView 控件,在该树形控件的每一节点前面定义了一个复选框,如图 需求: 在两个不同的应用程序中使用该控件,而它在不同应用程序中的外观则并不一致,按照本例,即一个显示复选框,一个不显示. 问题: 解决该问题的一个难处在于,Prism框架本身的设计原则——此 View 会被添加到主程序的 Shell 的 Region 中,所以在主程序中不能直接来控制该 View 的属性及其逻辑. 思路: 利用 EventAggregator 使得主程序与模块间进行通信,从而间接

WPF Step By Step 系列-Prism框架在项目中使用

WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Prism框架来构建基础的应用框架,并且如何来设计项目的架构和模块,下面我们就来一步步开始吧. 本文大纲 1.Prism框架下载和说明 2.Prism项目预览及简单介绍. 3.Prism框架如何在项目中使用. Prism框架下载和说明 Prism框架是针对WPF和Silverlight的MVVM框架,这

Prism for WPF再探(基于Prism事件的模块间通信)

上篇博文链接 一.简单介绍: 在上一篇博文中初步搭建了Prism框架的各个模块,但那只是搭建了一个空壳,里面的内容基本是空的,在这一篇我将实现各个模块间的通信,在上一篇博文的基础上改的. 先上效果图:初步介绍下,图中虚线分割为四个模块,每个模块可向另外三个模块发消息.这里还是基于模块化开发CS端程序的思路,模块之间低耦合,如果项目做大,好处自然体现出来了. 图中的效果已经实现了一个模块朝其他三个模块发送消息.这里我使用的事Prism框架中的PubSubEvent事件,其优点是简单易用,直接Pub

Prism 框架解读之一系列

名词解释 1.什么是IOC IOC是 Inversion of Control的缩写,多数书籍翻译成“控制反转”. IOC 和依赖注入(DI) 所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中. 2. Bootstrapper: 在程序中使用框架需要找到一个切入点,将框架植入进去,将一部分功能委托给框架来实现.在Silverlight中使用Prism的切入点就是App.xaml.cs中的Application_Startup方法.一般来说,这个方法中只是指定页面最先加

Prism框架研究(二)

首先在介绍本节内容之前,首先来看看官方文档来如何描述Prism 应用的初始化吧!A Prism application requires registration and configuration during the application startup process—this is known as bootstrapping the application,也就是说在在一个Prism应用程序开始之前首先要做的就是注册和配注应用程序,我们以此为突破点,一步步来剖析. 1 What is

架构、框架、模式、模块、组件、插件、控件、中间件的含义和区别

架构.框架.模式.模块.组件.插件.控件.中间件的含义和区别.经常看到这些概念,但是有些含糊,花点儿功夫整理一下,结果还是有些地方理解的不透彻,先将整理的内容写下来,以供交流.左侧英文栏中有些单词被分成了两半,放到了两行中,看的时候需要注意.欢迎各路大虾.大牛.大神拍砖警醒,油锤灌顶~~~ 术语 英文解释 中文解释 软件架构 architecture:Architecture is the art of planning, designing, and constructing building

WPF Prism框架下基于MVVM模式的命令、绑定、事件

原文:WPF Prism框架下基于MVVM模式的命令.绑定.事件 Prism框架下的自定义路由事件和命令绑定 BaseCode XAML代码: <Button x:Class="IM.UI.CommandEx.PrismCommandEx" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/wi

Prism框架的Regions使用

Prism框架的Regions,可以把用户控件.窗体等附加到主窗体指定的控件中. [实战] 1.新建Prsm Blank App(WPF) 项目:Demo0810 Views文件夹处,鼠标右键——添加——新建项——Prism——Prism UserControl(WPF),名称默认 MainWindow.xaml.cs代码: using System.Windows; using Prism.Regions; //引入Regions namespace Demo0810.Views { publ