这篇来讲事件.事件主要用来交互.
监听事件
我订阅了一些blog的rss,如果我订阅的blog发布了新的文章的话,系统(就是抓虾)就会帮我抓取新的rss信息
很好理解,一方订阅(Subscribe),一方发布(Publish).
prism的事件
prism的抽象类EventBase实现了事件的订阅和发布的操作.CompositePresentationEvent类继承自EventBase做了进一步封装,其是一个泛型类,我们可以通过CompositePresentationEvent来传递一个参数.
下面是一个简单的示例,记得先调用Subscribe方法订阅事件,然后调用Publish方法来发布,同时也可以调用Unsubscribe方法来取消订阅
private void SubscribeAndRaiseEvent() { CompositePresentationEvent<string> compositePresentationEvent = new CompositePresentationEvent<string>(); var action = new Action<string>((str) => { System.Windows.MessageBox.Show(str); }); compositePresentationEvent.Subscribe(action); compositePresentationEvent.Publish("hello"); compositePresentationEvent.Unsubscribe(action); compositePresentationEvent.Publish("hello"); }
多重订阅,可以订阅多个事件
private void MultipleSubscribersAndRaiseCustomEvent() { CompositePresentationEvent<string> compositePresentationEvent = new CompositePresentationEvent<string>(); var actionOne = new Action<string>((str) => { System.Windows.MessageBox.Show(str); }); var actionTwo = new Action<string>((str) => { System.Windows.MessageBox.Show(str); }); compositePresentationEvent.Subscribe(actionOne); compositePresentationEvent.Publish("hello"); compositePresentationEvent.Unsubscribe(actionTwo); compositePresentationEvent.Publish("world"); }
事件聚合模块交互
上面代码为示例,效果与.net内置的事件相似,只是做法不同而已,这样的话没多大意义,如果不同模块之间需要交互,那么事件就起作用了.
所以就需要一个容器来保存事件的状态,prism的IEventAggregator接口便是这样设计的
当事件被订阅的事件,IEventAggregator的GetEvent方法,该方法是一个泛型方法,传入的参数必须继承自EventBase,
该方法会先实例化这个类,所以我们不可以出现这样的代码
private void CustomEventWithEventAggregator() { eventAggregator.GetEvent<CompositePresentationEvent<string>>(); }
正确的做法是从CompositePresentationEvent派生一个类,如
private void CustomEventWithEventAggregator() { var action = new Action<string>((str) => { System.Windows.MessageBox.Show(str); }); eventAggregator.GetEvent<CustomEvent>().Subscribe(action); eventAggregator.GetEvent<CustomEvent>().Publish("hello"); } public class CustomEvent : CompositePresentationEvent<string> { }
以上代码为演示,你只需要明确定义Event的类型,就可以在不同模块交互.两个模块之间就不要相互引用,降低了耦合度.
事件的回调方式
当事件回调时(即事件被触发时),有三种方式.
1.同步线程 该怎么处理就怎么处理,默认情况下是以这种方式来处理的
2.在UI线程上触发,即调用了wpf Dispatcher的BeginInvoke方法
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, method, arg);
3.在后台线程上异步调用,即通过BackgroundWorker类来异步操作
public override void InvokeAction(Action<TPayload> action, TPayload argument) { BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += ((sender, e) => action((TPayload)e.Argument)); //handle worker.RunWorkerCompleted and log exceptions? worker.RunWorkerAsync(argument); }
这三种方式是由ThreadOption枚举来设定的
这便是CompositePresentationEvent类扩展的功能之一,如下代码
public virtual SubscriptionToken Subscribe(Action<TPayload> action, ThreadOption threadOption, bool keepSubscriberReferenceAlive, Predicate<TPayload> filter) { IDelegateReference actionReference = new DelegateReference(action, keepSubscriberReferenceAlive); IDelegateReference filterReference; if (filter != null) { filterReference = new DelegateReference(filter, keepSubscriberReferenceAlive); } else { filterReference = new DelegateReference(new Predicate<TPayload>(delegate { return true; }), true); } EventSubscription<TPayload> subscription; switch (threadOption) { case ThreadOption.PublisherThread: subscription = new EventSubscription<TPayload>(actionReference, filterReference); break; case ThreadOption.BackgroundThread: subscription = new BackgroundEventSubscription<TPayload>(actionReference, filterReference); break; case ThreadOption.UIThread: subscription = new DispatcherEventSubscription<TPayload>(actionReference, filterReference, UIDispatcher); break; default: subscription = new EventSubscription<TPayload>(actionReference, filterReference); break; } return base.InternalSubscribe(subscription); }
弱引用还是强引用?
通过上面的代码,我们看到该方法还有一个参数keepSubscriberReferenceAlive,默认值是false,就是弱引用了,如果你设置成强引用,记得在不需要事件的时候,取消事件的订阅.
事件过滤
Subscribe方法最后一个方法是filter事件过滤器,
举个例子我订阅了某某技术牛人的rss,平时他都写一些技术文章,可他也喜欢写了一些与技术无关的文章,我不想看,并不是他发布什么内容我都接受的,我是要有所选择的,我要把这些内容过滤掉.这个功能比较好.平时看报纸就没这个功能:).
上面的解释就是事件过滤器的功能.
事件在v2的改动不是很大,大家也可以参考这篇,有重复了,这篇就到这里
发表评论
-
wpf开发常见问题(1)
2008-10-22 21:42 1628经过一段时间wpf的学习和实际开发.现在与大家分享 ... -
初始化集合项依赖属性
2008-11-03 13:38 824在wpf自定义属性时,若此属性为集合类型的话,如 ... -
WPF and SL RadioButtonList Tip
2008-11-03 14:03 818在以下情境下.使用数据绑定分离UI与后端Model ... -
wpf datagrid笔记 part 1
2008-12-10 23:35 29311,基本属性 开关基本 ... -
Prism V2之旅(2)
2009-01-07 10:02 1200本篇将介绍Prism中Region的使用. 本篇D ... -
Prism V2之旅(3)
2009-01-07 15:24 873上篇介绍了Region的基本应用,这篇接上篇,继续介绍 ... -
Prism V2之旅(4)
2009-01-07 23:42 992上篇介绍了RegionAdapter的作用及如何如何 ... -
Prism V2之旅(5)
2009-01-13 11:54 1119上篇介绍了WPF的Attach Behavior(附加行 ... -
prism v2之旅(7)
2009-01-15 23:53 1149这篇继续介绍Module的功能. 第5篇已经介绍过模块的 ... -
XAML Guidelines
2009-01-17 11:31 876http://blogs.msdn.com/jaimer ... -
wpf中xaml的类型转换器与标记扩展
2009-02-02 14:03 2363这篇来讲wpf控件属性的类型转换器 类型转换器 类 ... -
wpf控件设计时支持(3)
2009-02-02 14:12 2782wpf设计时调试 编辑模型 装饰器 1.wpf ... -
wpf控件样式管理示意图
2009-02-04 14:40 1676...
相关推荐
1. **模块化(Modularity)**:Prism的核心特性之一是模块化,它允许将大型应用程序分解为小的、独立的模块,每个模块都有自己的功能。这样可以提高代码的可重用性,使得开发和维护变得更加容易。在示例中,你可能会...
Prism是一个流行的框架,它可以帮助开发者构建适用于.NET平台的模块化应用程序。本手册介绍的是Prism框架的官方指南,并说明了如何将Markdown文件转换成PDF格式。Prism框架主要针对WPF(Windows Presentation ...
GraphPad Prism 集生物统计、曲线拟合和科技绘图于一体,其所具有的功能均非常实用和精炼,包括了一些特色的功能,如ROC曲线分析、Bland-Altman分析等;曲线拟合功能是GraphPad Prism超越其他统计软体的制胜法宝,...
**WPF .Net6中使用Prism** WPF(Windows Presentation Foundation)是.NET Framework的一部分,用于构建具有丰富用户界面的应用程序。随着.NET平台的发展,.NET 6带来了更高效的开发体验。而Prism是一个强大的MVVM...
6. **视图模型定位(ViewModel Location)**:Prism自动定位视图模型,使得视图可以方便地找到对应的视图模型。 **在WPF中使用Prism** 在WPF应用中集成Prism,开发者首先需要安装Prism库,然后创建一个主应用壳体...
Prism 的核心特性之一是模块化。模块化允许将大型应用程序分解为小的、独立的功能单元,每个单元称为模块。这样可以分别开发、测试和部署这些模块,提高代码的复用性和可维护性。文件名 "Prism-7.2.0.1422" 可能包含...
Graphpad prism 6 MAC.dmg
prism模板 vs插件
6. **命令(Commands)**:Prism 提供了行为命令,如 DelegateCommand 和 RelayCommand,它们实现了 ICommand 接口,使视图模型能够触发视图中的操作,比如按钮点击事件。 7. **页面和容器的生命周期管理**:Prism....
6. 附加行为(Attached Behaviors):提供了一种扩展WPF控件行为的方法,使得开发者可以轻松地添加自定义行为,而无需直接修改控件的源代码。 7. 代理路由(Proxy Routing):对于网络应用,代理路由允许模块在加载...
The crack process of Delphi Prism Xe: 1. Install Delphi Prism Xe with key:MAAF-SPD7DK-BLAGAD-FEBN 2. Copy PrismXe.slip to C:\...6. exit and save. OK,you can run delphi prism Xe correctly! gwl18@qq.com
6. **Bootstrapper**:初始化Prism框架,设置模块目录,注册模块,配置IoC容器,以及设置事件总线。 7. **配置文件**:可能包含模块配置信息,如模块名称、依赖项等。 通过学习和实践这个`C#+WPF+Prism模块化开发...
GraphPad Prism 5.0 中文教程 GraphPad Prism 5.0 是一个功能强大的数据分析和图形化工具,它可以帮助用户快速、准确地处理和可视化数据。在本教程中,我们将详细介绍 GraphPad Prism 5.0 的使用方法和技巧,从...
GraphPad Prism 是一个包括基础生命统计、曲线匹配和科学作图的强大结合体。在一百多个国家有超过 10 万个科学家正在试用 Prism 来分析、绘图和呈现他们的科学数据。 是什么令许多世界上领先的大学、医学中心、研究...
WPF PRISM5.0框架源代码,适合WPF初学者或者有一定开发经验的C#程序员,包含:Microsoft.Practices.Prism、Microsoft.Practices.Prism.MefExtensions、 Microsoft.Practices.ServiceLocation
在本文中,我们将深入探讨如何在WPF应用中利用Prism框架实现一个可关闭的TabControl。WPF(Windows Presentation Foundation)是.NET Framework的一部分,提供了一种强大的方式来构建丰富的、具有图形用户界面的应用...
6. **事件总线**:通过事件总线,不同组件之间可以相互通信,而无需直接引用彼此,增强了组件的独立性。 7. **附加属性**:Prism提供了一系列附加属性,如Behavior、TriggerAction等,用于扩展XAML,让UI元素的行为...
模块化应用程序开发是Prism的核心优势之一,文档第四部分专注于此。构建模块化应用程序的好处被一一阐述,例如,它能提供更好的维护性、可扩展性和可测试性。文档详细讨论了IModule接口,该接口是模块化应用程序的...
Prism Central 是 Nutanix 企业云平台的一部分,它提供了一个集中管理界面,使得IT管理员可以轻松地跨多个Nutanix集群进行管理和监控。在本指南中,我们将详细探讨Prism Central的多个功能和特性,以及如何在Nutanix...
在探讨Delphi Prism 2010及其序列号的相关知识点时,我们首先需要明确几个重要的概念:Delphi Prism 2010是什么?它有哪些特点?以及如何合法地获取和使用该软件。 ### Delphi Prism 2010概述 Delphi Prism 2010是...