`
clingingboy
  • 浏览: 26945 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Prism V2之旅(6)

阅读更多

     这篇来讲事件.事件主要用来交互.

监听事件

 

订阅了一些blog的rss,如果我订阅的blog发布了新的文章的话,系统(就是抓虾)就会帮我抓取新的rss信息

image

很好理解,一方订阅(Subscribe),一方发布(Publish).

prism的事件

 

prism的抽象类EventBase实现了事件的订阅和发布的操作.CompositePresentationEvent类继承自EventBase做了进一步封装,其是一个泛型类,我们可以通过CompositePresentationEvent来传递一个参数.

image

 

下面是一个简单的示例,记得先调用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枚举来设定的

image

这便是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的改动不是很大,大家也可以参考这篇,有重复了,这篇就到这里

分享到:
评论

相关推荐

    Prism经典案例,Prism经典应用

    1. **模块化(Modularity)**:Prism的核心特性之一是模块化,它允许将大型应用程序分解为小的、独立的模块,每个模块都有自己的功能。这样可以提高代码的可重用性,使得开发和维护变得更加容易。在示例中,你可能会...

    Prism Manual.pdf Prism8框架官方手册 MD 文件转pdf

    Prism是一个流行的框架,它可以帮助开发者构建适用于.NET平台的模块化应用程序。本手册介绍的是Prism框架的官方指南,并说明了如何将Markdown文件转换成PDF格式。Prism框架主要针对WPF(Windows Presentation ...

    GraphPad Prism 6 试用版

    GraphPad Prism 集生物统计、曲线拟合和科技绘图于一体,其所具有的功能均非常实用和精炼,包括了一些特色的功能,如ROC曲线分析、Bland-Altman分析等;曲线拟合功能是GraphPad Prism超越其他统计软体的制胜法宝,...

    WPF .Net6中使用Prism

    **WPF .Net6中使用Prism** WPF(Windows Presentation Foundation)是.NET Framework的一部分,用于构建具有丰富用户界面的应用程序。随着.NET平台的发展,.NET 6带来了更高效的开发体验。而Prism是一个强大的MVVM...

    WPF Prism实例(多个实例包含Prism各个重要概念实例)

    6. **视图模型定位(ViewModel Location)**:Prism自动定位视图模型,使得视图可以方便地找到对应的视图模型。 **在WPF中使用Prism** 在WPF应用中集成Prism,开发者首先需要安装Prism库,然后创建一个主应用壳体...

    C#Prism 例子与源码

    Prism 的核心特性之一是模块化。模块化允许将大型应用程序分解为小的、独立的功能单元,每个单元称为模块。这样可以分别开发、测试和部署这些模块,提高代码的复用性和可维护性。文件名 "Prism-7.2.0.1422" 可能包含...

    Graphpad prism 6 MAC.dmg

    Graphpad prism 6 MAC.dmg

    prism模板 vs插件

    prism模板 vs插件

    Prism.Maui-master.zip

    6. **命令(Commands)**:Prism 提供了行为命令,如 DelegateCommand 和 RelayCommand,它们实现了 ICommand 接口,使视图模型能够触发视图中的操作,比如按钮点击事件。 7. **页面和容器的生命周期管理**:Prism....

    Prism 4.0安装包

    6. 附加行为(Attached Behaviors):提供了一种扩展WPF控件行为的方法,使得开发者可以轻松地添加自定义行为,而无需直接修改控件的源代码。 7. 代理路由(Proxy Routing):对于网络应用,代理路由允许模块在加载...

    Delphi Prism Xe Crack

    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

    C#+WPF+Prism模块化开发示例

    6. **Bootstrapper**:初始化Prism框架,设置模块目录,注册模块,配置IoC容器,以及设置事件总线。 7. **配置文件**:可能包含模块配置信息,如模块名称、依赖项等。 通过学习和实践这个`C#+WPF+Prism模块化开发...

    Graphpad-Prism5中文教程

    GraphPad Prism 5.0 中文教程 GraphPad Prism 5.0 是一个功能强大的数据分析和图形化工具,它可以帮助用户快速、准确地处理和可视化数据。在本教程中,我们将详细介绍 GraphPad Prism 5.0 的使用方法和技巧,从...

    GraphPad Prism 5.0 usb免安装版

    GraphPad Prism 是一个包括基础生命统计、曲线匹配和科学作图的强大结合体。在一百多个国家有超过 10 万个科学家正在试用 Prism 来分析、绘图和呈现他们的科学数据。 是什么令许多世界上领先的大学、医学中心、研究...

    WPF PRISM 5.0源码

    WPF PRISM5.0框架源代码,适合WPF初学者或者有一定开发经验的C#程序员,包含:Microsoft.Practices.Prism、Microsoft.Practices.Prism.MefExtensions、 Microsoft.Practices.ServiceLocation

    WPF Prism 可关闭的TabControl

    在本文中,我们将深入探讨如何在WPF应用中利用Prism框架实现一个可关闭的TabControl。WPF(Windows Presentation Foundation)是.NET Framework的一部分,提供了一种强大的方式来构建丰富的、具有图形用户界面的应用...

    Prism7.1.0.431_WPF_官方中文文档

    6. **事件总线**:通过事件总线,不同组件之间可以相互通信,而无需直接引用彼此,增强了组件的独立性。 7. **附加属性**:Prism提供了一系列附加属性,如Behavior、TriggerAction等,用于扩展XAML,让UI元素的行为...

    Prism7.1.0.431_WPF_官方中文文档.pdf

    模块化应用程序开发是Prism的核心优势之一,文档第四部分专注于此。构建模块化应用程序的好处被一一阐述,例如,它能提供更好的维护性、可扩展性和可测试性。文档详细讨论了IModule接口,该接口是模块化应用程序的...

    Prism Central 指南v5.5.pdf

    Prism Central 是 Nutanix 企业云平台的一部分,它提供了一个集中管理界面,使得IT管理员可以轻松地跨多个Nutanix集群进行管理和监控。在本指南中,我们将详细探讨Prism Central的多个功能和特性,以及如何在Nutanix...

    delphi Prism 2010 序列号(完全可用)

    在探讨Delphi Prism 2010及其序列号的相关知识点时,我们首先需要明确几个重要的概念:Delphi Prism 2010是什么?它有哪些特点?以及如何合法地获取和使用该软件。 ### Delphi Prism 2010概述 Delphi Prism 2010是...

Global site tag (gtag.js) - Google Analytics