Prism for WPF

Prism for WPF初探(构建简单的模块化开发框架)

 

  先简单的介绍一下Prism框架,引用微软官方的解释:

Prism provides guidance to help you more easily design and build, flexible, and easy-to-maintain client business apps that run on Windows Runtime, Windows Presentation Foundation (WPF) desktop, Silverlight, or Windows Phone 7. These apps may start small and evolve over time.

官方链接https://msdn.microsoft.com/en-us/library/ff648465.aspx,可下载到文档和示例代码。

  多的介绍就不必了,研究这套框架的人基本是做WPF或者Silverlight的人,我是新人,理解不深还请大神指教。听说Prism是开源的,做了才一年的小菜目前框架都用的不熟,以后再看源码吧。

Prism要用到IOC容器,提供选择的有Unity和MEF,这个系列的博文以后我都选用MEF。不懂MEF的建议看看这位大牛的系列博文http://www.cnblogs.com/yunfeifei/p/3922668.html

先说一下思路:

  1、Prism思想是模块化编程,我将主界面拆分为四个模块(A、B、C、D)。

  2、模块之间不能互相引用,也就是解耦了。

  3、目前就以上两点,要考虑到以后对项目进行扩展,所以预留一个Infrastructure(Project)放置模块之间抽象的东西。

  完成之后的界面图如下:

  解决方案总体结构:

一、基本结构搭建

  1、按照上图结构添加项目,注意只有Desktop.MainWindow中保留App.xaml,并且输出类型是Windows应用程序,其余的Project都要删除App.xaml,输出类型为类库。

  2、删除Desktop.MainWindow中的默认的MainWindow,新建一个Shell窗体,根据Prism的思想,这个Shell就是主窗体。

  3、为所有的Project添加Prism的引用,我这里为所有的Project安装了以下四个Prism的Nuget包。

  

  4、在ModuleA中新建类ModuleA,ModuleB,ModuleC,ModuleD,继承自IModule接口,只有继承这个接口才能被加载进Prism中。

  

using Prism.Modularity;
using Prism.Mef.Modularity;
using Prism.Regions;
using System.ComponentModel.Composition; namespace ModuleA
{
[ModuleExport("ModuleA", typeof(ModuleA), InitializationMode = InitializationMode.WhenAvailable)]
public class ModuleA : IModule
{
private readonly IRegionViewRegistry regionViewRegistry;
[ImportingConstructor]
public ModuleA(IRegionViewRegistry registry)
{
this.regionViewRegistry = registry;
}
public void Initialize()
{
regionViewRegistry.RegisterViewWithRegion("RegionA",typeof(View.GridA));
}
}
}

注意最后一行代码:

regionViewRegistry.RegisterViewWithRegion("RegionA",typeof(View.GridA));
RegionA就是主界面吧Shell中为ModuleA模块预留的位置,可以理解为占位符,View.GridA就是我们为ModuleA写的的界面。BCD模块同理。

  5、添加一个BootStrapper类,这个类要继承自MefBootstrapper。

  Prism提供四种配置模块加载的方式,看官方文档(这里我提供第一种和第二种方式):

  

  

using Prism.Mef;
using Prism.Modularity;
using Prism;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition.Hosting;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using ModuleA; namespace Desktop.MainWindow
{
public class BootStrapper:MefBootstrapper
{
protected override DependencyObject CreateShell()
{
return this.Container.GetExportedValue<Shell>(); } protected override void InitializeShell()
{
base.InitializeShell();
Application.Current.MainWindow = (Shell)this.Shell;
Application.Current.MainWindow.Show();
} protected override void ConfigureAggregateCatalog()
{
base.ConfigureAggregateCatalog();
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(BootStrapper).Assembly));
//this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(this.GetType().Assembly));
//第一种加载方式
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ModuleA.ModuleA).Assembly));
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ModuleB.ModuleB).Assembly));
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ModuleC.ModuleC).Assembly));
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ModuleD.ModuleD).Assembly));
} protected override IModuleCatalog CreateModuleCatalog()
{
// When using MEF, the existing Prism ModuleCatalog is still the place to configure modules via configuration files.
return new ConfigurationModuleCatalog();
}
//Prism提供四种加载模块的方式,以下是第二种从xaml文件中加载,注意文件要生成Resource,并且始终复制到输出目录
//protected override IModuleCatalog CreateModuleCatalog()
//{
// this.ModuleCatalog = new ModuleCatalog();
// var xamlCatalog = Prism.Modularity.ModuleCatalog.CreateFromXaml(new Uri("ModuleCatalogs.xaml", UriKind.Relative));
// //var xamlCatalog = Prism.Modularity.ModuleCatalog.CreateFromXaml(new Uri("ModuleCatalogs.xaml", UriKind.Relative));
// foreach (var item in xamlCatalog.Modules)
// {
// ModuleCatalog.AddModule(item);
// }
// return xamlCatalog; //}
}
}

  6、在App.xaml中把启动项设置为BootStrapper应该都会吧,不会的看源码哦。至此,一个简单的基于MEF的Prism框架就搭建好了。链接提供源码。

  源码在这呢

Prism for WPF的更多相关文章

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

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

  2. Prism for WPF 搭建一个简单的模块化开发框架 (一个节点)

    原文:Prism for WPF 搭建一个简单的模块化开发框架 (一个节点) 这里我就只贴图不贴代码了,看看这个节点之前的效果 觉得做的好的地方可以范之前的文章看看 有好的建议也可以说说   填充数据 ...

  3. Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单、导航

    原文:Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单.导航 这个实际上是在聊天之前做的,一起写了,也不分先后了 看一下效果图,上面是模块主导航,左侧是模块内菜单,现在加一下隐藏 ...

  4. Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务、WCF消息头添加安全验证Token

    原文:Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务.WCF消息头添加安全验证Token 为什么选择wcf?   因为好像wcf和wpf就是哥俩,,, 为什么选择异步 ...

  5. Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天、消息模块

    原文:Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天.消息模块 中秋节假期没事继续搞了搞 做了各聊天的模块,需要继续优化 第一步画页面 页面参考https://github.c ...

  6. Prism for WPF 搭建一个简单的模块化开发框架(三) 给TreeView加样式做成菜单

    原文:Prism for WPF 搭建一个简单的模块化开发框架(三) 给TreeView加样式做成菜单 昨天晚上把TreeView的样式做了一下,今天给TreeView绑了数据,实现了切换页面功能 上 ...

  7. Prism for WPF 搭建一个简单的模块化开发框架(二)

    原文:Prism for WPF 搭建一个简单的模块化开发框架(二) 今天又有时间了,再改改,加了一些控件全局的样式 样式代码 <ResourceDictionary xmlns="h ...

  8. Prism for WPF 搭建一个简单的模块化开发框架(一)

    原文:Prism for WPF 搭建一个简单的模块化开发框架(一) 最近闲来无事又想搞搞WPF..... 做个框架吧,可能又是半途而废....总是坚持不下来 不废话了, 先看一下工程结构 布局大概是 ...

  9. Prism for WPF初探(构建简单的模块化开发框架)

    先简单的介绍一下Prism框架,引用微软官方的解释: Prism provides guidance to help you more easily design and build, flexibl ...

随机推荐

  1. laravel本地开发的项目部署到服务器上

    不建议用ftp,建议用git.svn等工具从你的开发服务器上拉取.或者使用一些自动构建发布的工具.如果非要用ftp上传,建议用以下步骤: 服务器上安装composer,并使用`composer sel ...

  2. while循环以及格式化输出总结

    while循环: while 无限循环 count = 1 sum = 0 while True: sum = sum + count count = count + 1 if count == 10 ...

  3. dell win10 productkey

  4. 玩linux就是不断的踩坑,踩坑。最近的坑。xpath firefox兼容问题,抓取表格。

    最近在抓取一个页面表格时发现,用firefox提取的xpath,不能用,仔细分析后,发现是提取的xpath多了一个tbody标签.在xpath路径中删掉这段就好了. last_A5='/html/bo ...

  5. URL组成成分及各部分作用简介及urllib.parse / uri

    URL的一般格式为(带方括号[]的为可选项): protocol :// hostname[:port] / path / [;parameters][?query]#fragment urllib. ...

  6. css选择器思维导图

  7. 深入理解java虚拟机---虚拟机工具jps与jstat(十四)

    jps-java process status jps类似于linux的ps命令,用于查看进程. JPS 名称: jps - Java Virtual Machine Process Status T ...

  8. nopcommerce 4.1 net core 学习1

    关注nop有2年多, 基本都是下载看看结构, 里面的多语言跟主题模板 插件加载 是我比较喜欢的. 最近看nop4.1版本已经全面替换成了asp.net core 2.1 +ef core2.1,所以专 ...

  9. powerdesigner 使用

    1. 首先要确保机器安装了MySql的ODBC驱动,去http://dev.mysql.com/downloads/connector/odbc/5.1.html 下载 Connector/ODBC ...

  10. 基于MicroBlaze 的嵌入式系统设计

       reference: http://xilinx.eetrend.com/d6-xilinx/article/2013-03/3863.html 摘 要:当今时代,嵌入式系统已经无所不在,与人们 ...