Prism详解【转】

本文大纲

1、Prism框架下载和说明

2、Prism项目预览及简单介绍。

3、Prism框架如何在项目中使用。

Prism框架下载和说明

      Prism框架是针对WPF和Silverlight的MVVM框架,这个大家应该之前,都有所耳闻,关于该框架的具体说明,可以参考如下地址:

      Prism框架下载

      Prism框架通过功能模块化的思想,来讲复杂的业务功能和UI耦合性进行分离,通过模块化,来最大限度的降低耦合性,很适合我们

进行类似插件话的思想来组织系统功能。并且模块之间,通过发布和订阅事件来完成信息的通信。而且其开放性支持多种框架集成。

Prism项目预览及简单介绍

       框架下载完毕后,解压后的文件的组织模式如下:

     image

     我们先打开Hello World QuickStart.bat看看

      image

     上面是项目的组织结构,关于该项目内部的代码结构和写法,我们来一一分析和解释。

     A、先看看HelloworldModule的代码和内容。

     Views文件夹中包含了UI视图界面内容。

      image

     其中只是包含了一个Textbox文本控件,其他没有太多的内容。

     接着看看该设计文件对应的后台cs文件中的代码。

      image

     也是没有什么特别的内容。接着我们看看Module中的内容代码:

       image

        上面对于Module中的代码,我们就简单的分析完毕了,当然这个模块没有办法独立的运行,我们肯定要将模块加载到宿主或某个控制的主界面中,把它显示出来即可,下面我们就来看看Prism最关键的部分。

        B、宿主或主界面。

        先看看APP文件

         image

        设计视图中未指定,那么肯定是在cs文件中的某处直接或简介指定。

         image

      果然,这里采用了BootStrapper来完成Run方法,实现应用的启动,我们可以来深挖,看看该文件中都包含什么内容。

       image

      接着,我们来看看Shell中的内容:

       image

     我们在来看看shell里面有没有什么特殊的代码,打开后台cs文件

       image

      并无任何特殊的内容。所以我们可以大概的了解到了Prism的运行机制和流程,那么运行后的效果如下:

       image

       符合预期的目标,下面我们将继续深入的挖掘Prism的强大之处。

 

 

Prism框架如何在项目中使用

         Prism是一个强大的Mvvm框架,下面我们将重点讲解如何在项目使用Prism提供的基础功能,完成基于MVVM的WPF项目的框架设计和开发,包括应用程序的架构。

           image  

          项目的解决方案结构,项目采用Prism作为UI框架,NHiberia+Unity作为ORM和IOC框架。

         下面我们就来一步步解析项目中的每个部分的细节和最终项目如何把这些细节组织起来的做一个整体结构上的说明。关于其他的分层设计结构我就不多说了,只关注Prism部分的内容。

        1、关于对Prism的基础封装

         image

       为什么不直接使用Prism,我们希望开发人员的学习成本更低,所以,我们队Prism的一些方法进行了封装,更符合开发人员之前熟悉的MVVM模式。

       关于封装的具体内容,我们后续会看到代码。

       2、关于Infrastructure基础设施层定义

        image

       3、具体的模块定义

        image

       4、看看程序应用宿主的定义:

        image

      通过上面,我们介绍了基础的项目和具体的模块和宿主模块的定义,下面我们就来详细的分析下Prism如何加载模块的并且模块间如何通信,如何完成业务功能的完整流程:

      在之前介绍HelloWorld的时候,我们有简单的介绍了Prism的基本流程是宿主会在Bootstrappter中对模块进行装载并初始化,下面我们来看看我们在我给出的例子中的具体过程。

       a、Shell的定义:

        image

       与之前的区别就是在于,我们原来是手写的字符串,这里通过单独的类定义成静态的常量成员,我们能够防止名称出错的可能。同时我们也可以避免因为某处界面上Region符号的变化,因为某处没有修改,而造成不同步,运行出错的情况的发生,更容易统一的管理。具体的基础设施层中关于RegionType的定义如下:

        image

       接着查看Shell的后台cs代码:

     

复制代码
 1     /// <summary> 
 2     /// MainWindow.xaml 的交互逻辑 
 3     /// </summary> 
 4     [Export] 
 5     public partial class Shell : Window 
 6     { 
 7         public Shell() 
 8         { 
 9             InitializeComponent(); 
10         }
11 
12         /// <summary> 
13         /// 设置ViewModel 
14         /// </summary> 
15         /// <remarks> 
16         /// This set-only property is annotated with the <see cref="ImportAttribute"/> so it is injected by MEF with 
17         /// the appropriate view model. 
18         /// </remarks> 
19         [Import] 
20         [SuppressMessage("Microsoft.Design", "CA1044:PropertiesShouldNotBeWriteOnly", Justification = "Needs to be a property to be composed by MEF")] 
21         ShellViewModel ViewModel 
22         { 
23             set 
24             { 
25                 this.DataContext = value; 
26                 if (this.DataContext != null) 
27                 { 
28                     ((ShellViewModel)this.DataContext).OnStatusChanged += new Action<string>(SystemStatusManagementEventHandler); 
29                 } 
30             } 
31         }
32 
33         public void SystemStatusManagementEventHandler(string parameter) 
34         { 
35             if (parameter.IsNullOrEmpty()) 
36             { 
37                 throw new ArgumentNullException("无法完成操作"); 
38             }
39 
40             switch (parameter) 
41             { 
42                 case HM_EMSTS.WorkStation.Infrastructure.MenuParams.Max: 
43                     this.WindowState = System.Windows.WindowState.Maximized; 
44                     break; 
45                 case HM_EMSTS.WorkStation.Infrastructure.MenuParams.Min: 
46                     this.WindowState = System.Windows.WindowState.Minimized; 
47                     break; 
48                 case HM_EMSTS.WorkStation.Infrastructure.MenuParams.Close: 
49                     if (MessageBox.Show("是否退出系统?", "退出系统?", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.OK) 
50                     { 
51                         this.Close(); 
52                     } 
53                     break; 
54             } 
55         } 
56     }
复制代码

 

      上面的代码中采用了MEF中的Export特性和Import特性。 关于MEF的内容,我这里就不多介绍了,不是很了解的可以谷歌或百度下。

      继续,我们查看Shell的ViewModel定义,因为上面的后台的cs代码中有订阅相关的事件。

 

复制代码
 1    [Export(typeof(ShellViewModel))] 
 2    public class ShellViewModel : HM_EMSTS.WorkStation.UICommon.NotifyBaseObject 
 3    { 
 4        public Action<string> OnStatusChanged;
 5 
 6        [ImportingConstructor] 
 7        public ShellViewModel(IEventAggregator eventAggregator) 
 8        { 
 9            //注册事件 
10            if (eventAggregator == null) 
11            { 
12                throw new ArgumentNullException("eventAggregator"); 
13            }
14 
15            eventAggregator.GetEvent<HM_EMSTS.WorkStation.Infrastructure.Events.SystemStatusManagementEvent>().Subscribe(this.SystemStatusManagementEventHandler); 
16        }
17 
18        public void SystemStatusManagementEventHandler(string parameter) 
19        { 
20            if (parameter.IsNullOrEmpty()) 
21            { 
22                throw new ArgumentNullException("无法完成操作"); 
23            }
24 
25            if (OnStatusChanged != null) 
26                OnStatusChanged(parameter); 
27        } 
28    }
复制代码

 

   上面的代码,主要是为了完成对事件的订阅,并且当收到订阅的事件时,通知出去。这里特别注意,可以参考下图:

    image

      关于Event的定义我们可以看看上述Event的定义:

       image

      如果想按照,我们之前写的那样的形式来绑定和触发事件操作的话,必须这么写。

      那么下面我们来看看ShellModule的定义吧,我们这里的代码如下:

       image

      我们使用了某个Module项目中的页面来替换shell中的Region。这样保证了Shell运行起来后能够正确的显示界面。

      下面来看看项目中最重要的WorkStationBootstrapper的定义

        image

        前面介绍的helloWorld里面是采用的Unity容器,这里是MEF,所以要注意的部分,有所不同。这里需要制定MEF可导入导出部件所在的目录或程序集

         image

        我们知道shell后台cs的代码定义前面也说过了,有带有export标记。那么当执行上述的代码后,将会出现在MEFbootstrappter的Container中。这里的container是CompositionContainer是MEF中定义的。

        接着查看如下方法:

         image

        通过上面的几个方法,此时,我们的主程序,就完成了对Region的解析,显示出来即可。

        B、模块定义:

         image

        Module主要是为了,替换Region符合和标记为具体的界面而是用的。

        我们下面挑选一个页面来展示完整的定义和操作。

        1、Model定义:

         image

        当我们的Model具有自动通知机制时,特别对于列表中的某个单元格的属性发生改变后,不需要刷新整个列表,这时候就会自动完成更新,WPF会自动完成。

       2、IView接口定义。

        image

       因为我们这里采用MVP的设计模式,所以要求所有的View必须继承自IView接口。

        image

      我们这里都是直接定义View对应的唯一接口即可,主要是为了MEF的Export和Import时有用。

      3、View的定义。

      设计视图:

       image

      后台代码:

       image

     4、ViewModel的定义。

     这里由于我们采用MVP模式,所有对于不同View之间的交互,我们这里放到了Presenter中,ViewModel充当的是对IView界面的完全控制抽象。

        image

       所以我们看到这里,没有任何的业务代码。但是对已IView界面所有的绑定信息,都需要定义到该类中。

      5、Presenter定义。

       image

      上面讲Presenter标记了Export。主要是在Module中对Region进行映射时使用。

      然后我们来看看PresenterBase的定义,一看便明白

       image

      这样在构造展示器时,我们便可以将IView和ViewModel之间的关系完成绑定。

      6、Module的定义

        image

      这样我们就完成了,一个模块的功能开发,该功能模块尽量功能独立。

      最终,我们通过一个主界面,将这样功能模块组装起来即可。

最终

      将上面构建的模块运行下,看看效果,也许效果不是很好看,没有设置样式。

        image

    程序运行的框架还是非常的清晰,上面是工具栏,菜单栏,内容区。通过Prism我们可以讲菜单栏或者工具栏中的功能都设计成独立的模块,分别进行装载和控制,这样能够具有非常好的扩展性和可维护性。

hsapphire
关注 关注
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF Prism框架
07-08
很漂亮的界面,内含各种控件的样式及模板,下载把
WPF Step By Step 系列-Prism框架在项目中使用
weixin_34121304的博客
12-21 562
回顾         上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Prism框架来构建基础的应用框架,并且如何来设计项目的架构和模块,下面我们就来一步步开始吧。 本文大纲 1、Prism框架下载和说明 2、Prism项目预览及简单介绍。 3、Prism框架如何在项目中使用。 Prism框架下载...
PRISM-Python 中的规则一个简单的 Python 规则感应系统
最新发布
2401_85233349的博客
07-23 831
欢迎来到.PRISM 是一种现有算法(尽管我确实创建了一个 Python 实现),PRISM 相对简单,但在机器学习中,有时最复杂的解决方案效果最好,有时最简单的解决方案效果最好。然而,当我们希望建立可解释的模型时,简单性会带来很大的好处。PRISM 是一种规则归纳工具。也就是说,它创建一组规则来根据其他特征预测目标特征。规则在机器学习中至少有几个非常重要的用途。一是预测。与决策树、线性回归、GAM、、决策表和少数其他工具类似,它们可以提供可解释的分类模型。规则也可以简单地用作理解数据的一种技术。
22WPF----Prism框架
qq_58563355的博客
05-24 4234
文档可以参考源码地址:版本8.1Prism框架10+历史、微软,最新版本使用2、功能说明Prism提供了一组设计模式的实现,有助于编写结构良好的且可维护的XAML应用程序,包括MVVM、依赖注入、命令、事件聚合器3Prism框架关键程序Prism.Core:实现MVVM的核心功能,属于一个与平台无关的项目Prism.Wpf:包含了RegionModuleNavigation,其他的一些WPF的功能4、获取Prism框架。
WPF Prism框架学习
weixin_45936067的博客
06-27 2938
在 WPF 中,我们需要将普通属性换为依赖属性,以便在属性值发生变化时通知 UI 进行更新。BindableBase 的主要作用是将普通属性换为依赖属性,并在属性值发生变化时通知 UI 进行更新。如果需要在 WPF 中使用数据绑定,那么继承自 BindableBase 是一个很好的选择。2)、RegisterTypes 方法是 Prism 框架中用于注册视图模型的方法。它支持使用区域名称作为属性值来指定要显示的内容所在的区域。这些控件都是Prism框架内置的,可以直接在WPF应用程序中使用。
Prism框架WPF主界面列子,还带各种样式风格,Prism程序结构的划分
05-05
Prism框架WPF主界面列子,还带各种样式风格,各种事件的列子,Prism程序结构的划分
wpf prism itemscontrol 详解
05-26
WPF Prism 是一个用于开发 WPF 应用程序的框架,它提供了一些基本的工具和模板,使开发者能够更加轻松地构建模块化的、可扩展的应用程序。其中,ItemsControl 是一个非常重要的控件,它可以用来显示一个集合中的数据...
wpf prism viewmodel详解
05-26
WPF(Windows Presentation Foundation)是一个用于创建 Windows 应用程序的框架,而 Prism 是一个基于 WPF 的框架,它提供了一组设计模式和工具,用于帮助开发人员创建可扩展、可重用和易于维护的应用程序。...
wpf prism onnavigatedto 详解
05-26
在WPF Prism中,OnNavigatedTo方法是导航到某个页面时的回调方法。这个方法可以让开发者在导航到某个页面之前或之后执行一些操作。 具体来说,OnNavigatedTo方法会在导航到某个页面时被调用,并且可以接收一个...
C#Prism 例子与源码
01-04
**Prism 框架详解** Prism 是一个开源的微软 .NET 框架,专为构建可扩展、模块化、松耦合的 WPF 和 UWP 应用程序而设计。它由 Microsoft patterns & practices 团队开发,旨在帮助开发者遵循最佳实践和设计模式。在...
Prism 入门01,基础
build2024
06-03 205
Prism 框架是支持多平台的一种Prism框架不仅提供了基础的属性通知绑定、命令操作和消息聚合器(发布和订阅)等核心功能,还拥有一系列强大的附加特性,包括区域管理、模块化支持、灵活的导航机制以及会话服务等。这些功能共同构成了Prism框架的全面性和高效性,使其能够满足复杂应用的各种需求。下面就开始入门学习 Prism 框架。
WPF,Prism框架
05-28
MVVM
Prism框架实例、MEF框架实例
03-21
本解决方案中包含3个程序,1、简单的LocalDB数据的连接,项目名称是LocalDBOperate;2、Prism框架的简单实例,项目名称是Desktop.MainWindow;3、MEF的简单实例,项目名称MEFTest
WPF的Prism框架简介
weixin_41883890的博客
08-11 2397
模块目录由模块经理和模块加载器组件使用,它们负责在模块处于远程时下载模块,将模块的组件加载到应用程序域中,并初始化模块。棱镜支持两种导航样式:基于状态的导航,其中对现有视图的状态进行更新以实现简单的导航方案,以及创建新视图并在应用程序 UI 中替换旧视图的视图切换导航。复合应用程序中的组件通常需要以松散耦合的方式与应用程序中的其他组件和服务进行通信。通过重复使用单元测试的组件,可以通过依赖性注入在运行时间轻松发现和集成,以及通过使用可在应用程序中重复使用的应用程序级功能封装模块,在应用级别实现重复使用。..
Prism框架搭建(MVVM)
weixin_43632687的博客
06-04 3095
一.新建一个项目,把App.xaml 中的启动路径删掉,在App.saml.cs中重写OnStartup方法.启动初始化文件Bootstrapper.cs 二.1/在项目中创建Bootstrapper.cs初始化文件,继承MefBootstrapper类,重写ConfigureAggregateCatalog()方法 设定参数(使用范围).导入Mef  Prism5.0版本的包. 2/...
WPF Prism框架(MVVM)
qq_57212959的博客
07-29 1414
Modules:Modules是能够独立开发、测试、部署的功能单元,Modules可以被设计成实现特定业务逻辑的模块(如Profile Management),也可以被设计成实现通用基础设施或服务的模块(如Logging、Exception Management)。ModuleCatalog:在Prism中,Module Catalog指明了要Load哪些Module,和用什么样的顺序去Load这些Module。
WPF之Prism框架
qq_37875849的博客
03-11 1106
对于单个Command而言, 只是触发单个对应的功能, 而复合命令是Prism当中非常强大的功能, CompositeCommand简单来说是一个父命令, 它可以注册N个子命令。众所周知, 如果你了解WPF当中的ICommand, INotifyPropertyChanged的作用, 就会发现。在最常见的开发模式当中, 我们去设计某个页面的时候, 实际上界面元素在设计的时候已经被固定。可以弹出一个我们指定的窗口, 仅此而已, 那么在Prism当中, Dialog指的是什么?
【WPF之Prism框架】
xiaochuideai的博客
08-08 5824
融合官方文档和个人理解并参考其他博主的相关文章,对prism框架下的各个功能模块进行了较为详细的整理,并通过案例代码的方式更加直观的呈现相关函数的功能。以方便与自我复习和理解。
写文章

热门文章

  • 经典国外网站大放送 10068
  • weblogic简单介绍 7836
  • 推荐几个好的域名交易站点 7098
  • 终于把英文版操作系统中文乱码问题解决了 6089
  • Easytrader踩坑之旅(一) 5968

分类专栏

  • [网站分类].NET新手区 208篇
  • [网站分类]非技术区 10篇
  • [网站分类]其他技术区 6篇
  • [网站分类].NET精华区 6篇
  • [网站分类]jQuery 6篇
  • [网站分类]ASP.NET 116篇
  • [发布至博客园首页] 5篇
  • [网站分类]首页候选区 31篇
  • [随笔分类]摘抄文字[非技术] 3篇
  • [随笔分类]养生保健 4篇
  • [随笔分类]小说九鼎记 2篇
  • [网站分类]C# 73篇
  • [网站分类]求职面试 3篇
  • [随笔分类]技术文章 15篇
  • [随笔分类]NET知识库 80篇
  • [网站分类]JavaScript 3篇
  • [网站分类]转载区 12篇
  • [随笔分类]错误集 12篇
  • [网站分类]WinForm 1篇
  • [网站分类]程序人生 7篇
  • [网站分类]SQL Server 15篇
  • [网站分类]读书区 15篇
  • [随笔分类]网站 31篇
  • [随笔分类]赚钱 4篇
  • [随笔分类]个人总结 1篇
  • [网站分类]项目与团队管理 1篇
  • [网站分类]Html/Css 10篇
  • [网站分类]Google开发 3篇
  • [随笔分类]加速及SEO 8篇
  • [随笔分类]旅游备注 2篇
  • [网站分类]企业信息化其他 1篇
  • [网站分类]架构设计 3篇
  • [随笔分类]重要注册 1篇
  • [网站分类]Linux 20篇
  • [网站分类]PHP 11篇
  • [网站分类]VS2010 1篇
  • [随笔分类]Linux+PHP 10篇
  • [网站分类]ASP.NET MVC 1篇
  • [网站分类]C++
  • [网站分类]CLR 1篇
  • [随笔分类]问题集 2篇
  • [网站分类]代码与软件发布 1篇
  • [网站分类]Android开发
  • [网站分类]MySQL
  • [网站分类]开源研究 5篇
  • sqlserver 2篇
  • RabbitMQ 1篇
  • 架构 1篇

最新评论

  • Easytrader踩坑之旅(一)

    涂可70: 我的天,这没法玩了,大神你也是厉害,我看着你的都没法整

  • EasyTrader踩坑之旅(三)

    Balan_Py: 您好,我在使用 user.buy('162411', price=0.55, amount=100) 的时候,会进入客户端的买入界面,但是没有下单 代码返回{'massage':'success'},请问您知道这是哪里出问题了吗?求解答,万分感谢!

  • 银行代销系统调研

    qq675312877: 哪个银行的代销系统??

  • EasyTrader踩坑之旅(三)

    mystao: 你好,请问通过spy++ 拿到句柄(00030B0E)以后怎么获取control id,谢谢?

  • 数据采集程序

    dalaodedidi: 大佬就是不一样

最新文章

  • 为什么要监控sql语句,以及如何监控,都有哪几种方式可以监控。
  • 关于hexo与github使用过程中的问题与笔记
  • IIS错误代码500.21 ,Nhibernate更新报错,委托的使用。action传参数
2019年33篇
2014年97篇
2013年5篇
2012年96篇
2011年430篇
2010年797篇
2009年317篇
2008年15篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家广西玻璃钢雕塑租赁杭州南海玻璃钢人物雕塑南平玻璃钢人物雕塑玻璃钢雕塑电镀加工厂家河北艺术商场美陈供应商呼和浩特玻璃钢雕塑找谁家河北室内商场美陈供货商贵州玻璃钢小羊动物雕塑艺术摆件陕西优质玻璃钢景观雕塑丽江市玻璃钢雕塑哪家好澳门玻璃钢雕塑多少钱宁夏动物玻璃钢雕塑公司玻璃钢不锈钢园林雕塑厂家贴马赛克玻璃钢雕塑批发长沙创意玻璃钢雕塑商场卖场美陈桁架校园玻璃钢雕塑设计玻璃钢雕塑手绘美甲深圳季节性商场美陈市场玻璃钢动物兔子雕塑宝山专业玻璃钢雕塑贵州玻璃钢卡通雕塑价格建邺玻璃钢花盆花器济宁玻璃钢迎宾人物雕塑设计公司河南玻璃钢人物雕塑厂家哪家好石景山玻璃钢海洋雕塑街区ip玻璃钢雕塑批发玻璃钢滑板人物雕塑制作登封玻璃钢卡通雕塑海口加工玻璃钢雕塑精准推荐香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化