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

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框架就搭建好了。链接提供源码。

  源码在这呢

 

posted on 2018-06-01 10:45 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/9120595.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux yum 安装MariaDB

1、在 /etc/yum.repos.d/ 下建立 MariaDB.repo,内容如下: [azureusermono etc]cd/etc/yum.repos.d[azureusermonoyum.repos.d]cd /etc/yum.repos.d [azureuser@mono yum.repos.d] vi MariaDB.repo MariaDB 10.0 CentOS repository list - created 2013-08-23 13:08 UTC h…

EBITDA的计算公式

EBITDA基本原理 EBITDA最早是在20世纪80年代中期使用杠杆收购的投资机构在对那些需要再融资的账面亏损企业进行评估时开始被大量使用。他们通过计算EBITDA来快速检查公司是否有能力来偿还这笔融资的利息。玩杠杆收购的那些投资银行家们推广了EBITDA的使用&#xff0c;他们通过E…

Linux/Centos下安装部署phantomjs 及使用

文章转载自&#xff1a;http://www.cnblogs.com/10-22/articles/4383196.html PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API。它全面支持web而不需浏览器支持&#xff0c;其快速&#xff0c;原生支持各种Web标准&#xff1a; DOM 处理, CSS 选择器, JSON, Canvas, …

Hadoop Balancer运行速度优化

1.修改dfs.datanode.max.transfer.threads 4096 (如果运行hbase的话建议为16384)&#xff0c;指定用于在DataNode间传输block数据的最大线程数&#xff0c;老版本的对应参数为dfs.datanode.max.xcievers 2.修改dfs.datanode.balance.bandwidthPerSec 31457280 ,指定DataNode…

15-[JavaScript]-ECMAScript 1

0.javaScript的发展历程 https://zhuanlan.zhihu.com/p/27985124 1、javaScript是什么&#xff1f; javaScript是一种web前端的描述语言&#xff0c;也是一种基于对象&#xff08;object&#xff09;和事件驱动&#xff08;Event Driven&#xff09;的、安全性好的脚本语言。 它…

Spark性能调优

文章转载&#xff1a;http://gad.qq.com/article/detail/20239 通常我们对一个系统进行性能优化无怪乎两个步骤——性能监控和参数调整&#xff0c;本文主要分享的也是这两方面内容。 一、性能监控工具 【Spark监控工具】   Spark提供了一些基本的Web监控页面&#xff0c…

WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code)

WPF MVVM 架构 Step By Step(2)&#xff08;简单的三层架构示例及粘合代码GLUE code&#xff09; 原文:WPF MVVM 架构 Step By Step(2)&#xff08;简单的三层架构示例及粘合代码GLUE code&#xff09;我们第一步就是去了解三层架构和问题然后去看MVVM是怎么去解决这些问题的。…

基于YARN集群构建运行PySpark Application

文章转载&#xff1a;https://www.tuicool.com/articles/eaYVN3v Spark Application可以直接运行在YARN集群上&#xff0c;这种运行模式&#xff0c;会将资源的管理与协调统一交给YARN集群去处理&#xff0c;这样能够实现构建于YARN集群之上Application的多样性&#xff0c;比…

[luogu4133 BJOI2012] 最多的方案 (计数dp)

题目描述 第二关和很出名的斐波那契数列有关&#xff0c;地球上的OIer都知道&#xff1a;F11, F22, Fi Fi-1 Fi-2&#xff0c;每一项都可以称为斐波那契数。现在给一个正整数N&#xff0c;它可以写成一些斐波那契数的和的形式。如果我们要求不同的方案中不能有相同的斐波那契…

Apache nifi 集群安装

原文地址&#xff1a;https://pierrevillard.com/2016/08/13/apache-nifi-1-0-0-cluster-setup/ 文章写的很好了&#xff0c;步骤性的英文写得也比较易懂&#xff0c;原样搬过来了&#xff0c;没有再翻译 As you may know a version 1.0.0-BETA of Apache NiFi has been rele…

stixel提升思路总结

1.用psmnet获得更好的disparity 2.用edgebox获得整个rgb图片的边缘,然后通过原本的stixel的上下边缘去寻找最优,用两个的边缘去重新得到一个新的边缘,但获得的轮廓不仅仅是外轮廓还有内部的轮廓,得出的结果比之前没有太多提升. 目前可以尝试在disparity图求边缘这种方式 3.使用…

Hive分区表count(*)不起mapreduce的真相

问题背景&#xff1a; 在对Hive求count(*)时&#xff0c;发现有些表会启mapreduce计算、返回 结果&#xff0c;比较耗时&#xff0c;有的表1秒之内返回结果 刚开始以为刚刚执行过一次count()后会对结果进行缓存&#xff0c;不用再去跑mapreduce&#xff0c;但经进一步实验发现…

进阶攻略|前端完整的学习路线

最近写了一篇关于前端一些常见轻便耐用的UI框架的小总结&#xff0c;很多小伙伴私信问我&#xff0c;要怎么学习前端&#xff0c;没有明确的方向&#xff0c;为了感谢大家的关注点赞打赏和喜欢&#xff0c;决定把前端的学习进阶之路稍微整理一下&#xff0c;也为了自己能在工作…

Kylin下构建Cube第一步出错:shell-init: error retrieving current directory

问题背景&#xff1a; 生产环境部署的Kylin-2.1&#xff0c;官方发布的最新安装包并不支持更改hbase存储的namespace&#xff0c;修改源码后重新打包部署过程中&#xff0c;build cube第一步出错 大概错误信息是&#xff1a; OS command error exit with 5 – hive -e "…

python 字典练习 记录学生是否交作业的小程序

#记录学生是否交作业的小程序 #包括&#xff1a;学生名字、日期、状态 1 data{2 taotao:{3 2018-6-3:已交,4 2018-6-4:未交,5 2018-6-5:已交6 } 7 mingming:{8 2018-6-3:未交,9 2018-6-4:已交 10 } 11 } #1、判断名字和日期是否…

boost::timer库使用

boost::timer boost库定时器使用&#xff0c;需要在编译时加相关链接库 -lboost_timer -lboost_system boost::timer::cpu_timer 和boost::timer::auto_cpu_timer用于精确定时&#xff0c;有start(),elapsed(),is_stopped()等方法&#xff0c;elapsed()方法返回的时结构体boost…

Kylin 2.0升级总结

文章转载&#xff0c;原文地址&#xff1a;https://blog.bcmeng.com/post/kylin-upgrade.html #6-给kylin社区的建议 引用于个人自查、学习 Kylin 2.0的升级节奏 升级的大原则 升级的目标 1 Kylin 2.0 升级流程 1.1 Kylin 2.0 代码合入 1.2 配置更新和梳理 1.3 兼容性测…

Html5 学习笔记 --》html基础 css 基础

HTML5 功能 HTML5特点 <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"utf-8"><title>基本格式</title> </head> <body><a href"http://www.baidu.com">百度</a> </b…

Kylin修改默认hbase namespace命名空间default的解决方案

问题及背景&#xff1a;同一用户的三家公司的物理集群合并&#xff0c;合并后用dataspacekerberos控制不同公司对集群资料的访问权限&#xff0c;三家公司分别使用独立的kerberos票据访问&#xff0c;特定的namespace,而生产环境部署的kylin-2.0/2.1只能保存cuboid到hbase 的 d…

pip download timeout 下载慢,超时解决方法

更换国内的pypi源&#xff1a; 如&#xff1a; pip install -i https://pypi.tuna.tsinghua.edu.cn/simple –upgrade tensorflow-gpu