目的

本文主要介绍如何使用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在模块间进行通信的更多相关文章

  1. Prism之使用EventAggregation进行模块间通信

    在开发Silverlight程序的时候,经常需要在不同的组件间进行通信.比如点击一个button,可能就需要改变另一个控件的内容.比较直接的办法是使用事件,当然使用MVVM的时候也可以使用comman ...

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

    示例蓝牙: 蓝牙A地址:3014:10:271614 蓝牙B地址:2015:2:120758 //============================================= 步骤: 1 ...

  3. iframe框架子页面与父页面间的通信

    需要注意的问题:页面最好放在服务器上测试避免跨域问题. 具体参考:http://www.cnblogs.com/ljhero/archive/2011/07/09/2101540.html

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

    背景: 在模块的UI中包含 TreeView 控件,在该树形控件的每一节点前面定义了一个复选框,如图 需求: 在两个不同的应用程序中使用该控件,而它在不同应用程序中的外观则并不一致,按照本例,即一个显 ...

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

    WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Pr ...

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

    上篇博文链接 Prism for WPF初探(构建简单的模块化开发框架) 一.简单介绍: 在上一篇博文中初步搭建了Prism框架的各个模块,但那只是搭建了一个空壳,里面的内容基本是空的,在这一篇我将实 ...

  7. 项目中使用Prism框架

    Prism框架在项目中使用   回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Prism框架来构建基础的应用框架,并且 ...

  8. Prism框架在项目中使用

    本文大纲 1.Prism框架下载和说明 2.Prism项目预览及简单介绍. 3.Prism框架如何在项目中使用. Prism框架下载和说明 Prism框架是针对WPF和Silverlight的MVVM ...

  9. Prism框架的Module(模块化)编程

    Prism框架用的是新版本的,Prism7.1.关于其中的变动,感兴趣的参考https://www.cnblogs.com/hicolin/p/8694892.html 如何告诉Shell(我们的宿主 ...

随机推荐

  1. LeetCode_Combinations

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...

  2. GetSystemTime API可以得到毫秒级时间

    用Now返回的日期格式中年只有2位,即2000年显示为00, 这似乎不太令人满意. 此外Now和Time都只能获得精确到秒的时间,为了得到更精确的毫秒级时间,可以使用API函数GetSystemTim ...

  3. 2015第15周六Java线程池

    Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具.真正的线程池接口是ExecutorService. 比较重要的几个类: Ex ...

  4. js 写table 函数

    //创建 table函数 function table(row,col,b,w) { document.write('<table border='+b+'>'); for(var i=0 ...

  5. Promise 异步执行的同步操作

    Promise 是用来执行异步操作的. 但有时一个异步操作需要等其他的异步操作完成,这时候就可以使用then来做. function loadImageAsync(url) { return new ...

  6. eclipse在ubuntu13.04下崩溃crash

    错误信息: # # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0 ...

  7. java集合总结【转】

    Map.Set.Iterator迭代详解 Map接口定义了四种类型的方法,每个Map都包含这些方法. equals(Object o)比较指定对象与此Map的等价性. hashCode()返回此Map ...

  8. .NET(C#):分析IL中的if-else,while和for语句并用Emit实现

    这是一篇关于IL和反射Emit的文章(所以不喜欢IL或者Emit的就没必要往下看了),要求读者对IL和Emit工作原理较了解.所有分析IL均在Visual Studio 2010 SP1下编译生成.( ...

  9. [Regex Expression] Match mutli-line number, number range

    /^-?\d{,}\.\d+$/gm

  10. [Regular Expressions] Find a String that Precedes Another String ?= , ?!

    Let's image tow cases for the following string: var str = `foo foobar foobaz fooboo` First of all: w ...