Prism框架的Module(模块化)编程
Prism框架用的是新版本的,Prism7.1。关于其中的变动,感兴趣的参考https://www.cnblogs.com/hicolin/p/8694892.html
如何告诉Shell(我们的宿主程序)去Load哪些Module,Prism框架用的是模块目录ModuleCatalog,ModuleCatalog包含了可以被APP使用的模块信息。
方式一:通过配置文件(App.config)创建模块目录(ModuleCatalog)
1、新建Prism Blank App(WPF) 项目:BlankApp7
BlankApp7处鼠标右键——添加——新建项——应用程序配置文件,App.config
2、新建Prism Module(WPF)项目:ModuleA

3、ModuleA中有个ModuleAModule.cs文件,实现ViewA与主窗体的ContentRegion的关联(四种方式的ModuleAModule.cs内容都一样)
using ModuleA.Views;
using Prism.Ioc;
using Prism.Modularity;
using Prism.Regions; namespace ModuleA
{
public class ModuleAModule : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
var regionManager = containerProvider.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA)); //viewA与ContentRegion进行关联
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{ }
}
}
App.xaml.cs目录创建于配置文件
using BlankApp7.Views;
using Prism.Ioc;
using Prism.Modularity;
using System.Windows; namespace BlankApp7
{
public partial class App
{
protected override Window CreateShell()
{
return Container.Resolve<MainWindow>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
}
protected override IModuleCatalog CreateModuleCatalog()
{
return new ConfigurationModuleCatalog(); //目录创建于配置文件
}
}
}
配置文件App.config,可知有一个名为ModuleAModule的Module,集合于ModuleA.dll中,startupLoaded是否在启动时就加载(显示)。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf" />
</configSections>
<modules>
<module assemblyFile="ModuleA.dll" moduleType="ModuleA.ModuleAModule, ModuleA" moduleName="ModuleAModule" startupLoaded="True" />
</modules>
</configuration>
4、由于BlankApp7要加载ModuleA,所以要引用ModuleA生成的dll。
ModuleA处鼠标右键——生成,ModuleA的bin文件夹中就会出现ModuleA.dll
BlankApp7处鼠标右键——添加——引用,浏览,找到ModuleA.dll(不建议复制粘贴dll到BlankApp7的bin目录,因为如果重新生成ModuleA.dll,那么新的dll不会出现在BlankApp7的bin目录,依旧是拷贝的旧dll)
运行结果如图

方式二:Code方法,调用AddModule()
仿照方式一创建项目BlankApp8、ModuleA,只需要更改ModuleAModule.cs、App.xaml.cs。其他文件默认不动。
ModuleAModule.cs,内容与方式一一样
App.xaml.cs
using BlankApp8.Views;
using Prism.Ioc;
using Prism.Modularity;
using System.Windows; namespace BlankApp8
{
public partial class App
{
protected override Window CreateShell()
{
return Container.Resolve<MainWindow>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
}
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) //配置模块目录
{
moduleCatalog.AddModule<ModuleA.ModuleAModule>(); //使用AddModule方法
}
}
}
运行时,依然按照方式一的第4步骤生成并引用dll。
方式三:指定dll所在目录的方式,因此就不用按照方式一的第4步骤生成并引用dll了。
与方式二一样,只需要更改两个文件ModuleAModule.cs、App.xaml.cs。ModuleAModule.cs内容与方式一一样。
App.xaml.cs指定要加载的dll的目录
using BlankApp8.Views;
using Prism.Ioc;
using Prism.Modularity;
using System.Windows; namespace BlankApp8
{
public partial class App
{
protected override Window CreateShell()
{
return Container.Resolve<MainWindow>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
}
protected override IModuleCatalog CreateModuleCatalog()
{
//return new DirectoryModuleCatalog() { ModulePath = @"./" }; //当前目录,即BlankApp8\BlankApp8\bin\Debug。需拷贝ModuleA.dll到当前目录中
return new DirectoryModuleCatalog() { ModulePath = @"C:\Users\jv\source\repos\BlankApp8\ModuleA\bin\Debug" };//不拷贝ModuleA.dll,使用绝对目录
}
}
}
方式四:加载模块的方式,与方式一同样可以实现内容的显示与否。
只需要更改两个文件ModuleAModule.cs、App.xaml.cs。ModuleAModule.cs内容与方式一一样。
App.xaml.cs
using BlankApp8.Views;
using ModuleA; //引入ModuleA
using Prism.Ioc;
using Prism.Modularity;
using System.Windows; namespace BlankApp8
{
public partial class App
{
protected override Window CreateShell()
{
return Container.Resolve<MainWindow>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
}
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
var moduleAType = typeof(ModuleAModule);
moduleCatalog.AddModule(new ModuleInfo()
{
ModuleName = moduleAType.Name,
ModuleType = moduleAType.AssemblyQualifiedName,
InitializationMode = InitializationMode.WhenAvailable //显示View内容
//InitializationMode = InitializationMode.OnDemand //不显示View内容
});
}
}
}
运行时,依然按照方式一的第4步骤生成并引用dll。
Prism框架的Module(模块化)编程的更多相关文章
- Java9系列第8篇-Module模块化编程
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
- 项目中使用Prism框架
Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Prism框架来构建基础的应用框架,并且 ...
- WPF Step By Step 系列-Prism框架在项目中使用
WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Pr ...
- Prism框架在项目中使用
本文大纲 1.Prism框架下载和说明 2.Prism项目预览及简单介绍. 3.Prism框架如何在项目中使用. Prism框架下载和说明 Prism框架是针对WPF和Silverlight的MVVM ...
- Prism框架研究(一)
从今天起开始写一个Prism框架的学习博客,今天是第一篇,所以从最基本的一些概念开始学习这个基于MVVM的框架的学习,首先看一下Prism代表什么,这里引用一下比较官方的英文解释来看一下:Prism ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- 【模块化编程】理解requireJS-实现一个简单的模块加载器
在前文中我们不止一次强调过模块化编程的重要性,以及其可以解决的问题: ① 解决单文件变量命名冲突问题 ② 解决前端多人协作问题 ③ 解决文件依赖问题 ④ 按需加载(这个说法其实很假了) ⑤ ..... ...
- 【javascript激增的思考01】模块化编程
前言 之前我做过一个web app(原来可以这么叫啦),在一个页面上有很多小窗口,每个小窗口都是独立的应用,比如: ① 我们一个小窗口数据来源是腾讯微博,需要形成腾讯微博app小窗口 ② 我们一个小窗 ...
- require.js实现js模块化编程(一)
1.认识require.js: 官方文档:http://requirejs.org/RequireJS是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一.最新版本的Requ ...
随机推荐
- 阿里云ECS云服务器CentOS部署个人网站
ping了一下coding pages和阿里云服务器的速度,意外感觉coding的速度反而更快.不过为了折腾,还是把博客迁移到阿里云,跌跌撞撞遇到很多坑,大多是由于对指令不熟悉以及部分教程省略了部分步 ...
- spring-boot 环境搭建(一)
环境 jdk 8 tomcat 8.5 sts 4.4.2 maven 3.6.1 新建 maven 项目 首先创建一个普通的 maven 项目. pom.xml <project xmlns= ...
- mybatis 基础(一) xml配置
如果文章有误,请各位楼下评论,感谢各位积极修正! 一起学习,成为大佬! mybatis: 1.轻量级 2.高级映射(实体类与数据库表字段的映射) 这样就可以后续开发中去操作实体类而不需要去关注数据库, ...
- Jmeter之参数化(4种设置方法)
以多用户登录为例~~~ 参数化: 1.用户参数 2.CSV数据文件 3.函数助手CSVRead 4.用户自定义的变量 1.用户参数 脚本目录结构如下: 因为设置了2组账号密码,所以线程数设置为2(添加 ...
- vue之scoped穿透
vue之scoped穿透 问题:在页面中,需要了第三方插件的样式,又不想取消scoped,防止造成样式污染 方法:>>> 代码: #tab >>> .ivu-tab ...
- 【持续集成工具】 Jenkins
一.什么是持续集成 持续集成(CI):简单来说就是指将开发者的工作内容频繁地集成到主干中. 而持续集成工具可以将开发者频繁需要构建,编译,测试,部署等操作自动进行,为开发提供了非常大便利. 二.持续集 ...
- Java学习笔记【十二、网络编程】
原计划的学习结束时间是3月4日,目前看来已经延迟了,距离低标还差一些,多方面原因,也不找借口,利用周末赶赶进度,争取本周末把低标完成吧! 参考: http://www.runoob.com/java/ ...
- WiFi 6是否适合个人用户
5G已经被热炒得家喻户晓,但与其对标的WiFi新技术标准——Wi-Fi 6却可能有着更好的经济和技术前景,WiFi 6也称为802.11ax,比过去的Wi-Fi技术更好,速度更快能跟5G对标,连接性更 ...
- vim复制到剪切板
作者:whinc链接:https://www.zhihu.com/question/19863631/answer/89354508来源:知乎 转载文章 Vim 中的复制.删除的内容都会被存放到默认( ...
- shell脚本基础和grep文本处理工具企业应用1
bash特性及bash脚本编程初步: 用户要跟计算机交互就需要有终端,比如:显示器.键鼠等,在终端有附着的接口程序 GUI:KDE.GNome.Xfce CLI:/etc/shells bash ...