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 ...
随机推荐
- 避免同一个文件被#include多次,可以用以下两种方式
1.#ifndef方式 2.#pragma once方式 方式一: #ifndef _SOMEFILE_H_ #define _SOMEFILE_H_ ... ...//一些声明语句 #end ...
- 洛谷P1088 火星人
//其实就是全排列 //我们从外星人给的那串数字往下搜索 //一直往下拓展m次 //最后输出结果 //虽然看起来很暴力,但是题目上说了m非常小 #include<bits/stdc++.h> ...
- Boot-crm管理系统开发教程(一)
ps:上周就把这个项目写完了,一直忘记记录,现在补上. Boot-crm是书上第十八章的内容,书上提供了前端的代码,所以只需要写后端的代码就可以了,①所以我们先把前端的代码移植到项目中. ②然后在li ...
- Java 面向对象的设计原则
一. 1.面向对象思想的核心: 封装.继承.多态. 2.面向对象编程的追求: 高内聚低耦合的解决方案: 代码的模块化设计: 3.什么是设计模式: 针对反复出现的问题的经典解决方案,是对特定条件下( ...
- vue中使用qrcode,遇到两次渲染的问题
1.安装 qrcodejs2: npm install qrcodejs2 --save 2.页面中引入: import QRCode from "qrcodejs2"; co ...
- Vue访问权限
设置权限 <script> export default { created(){ if(this.$store.state.userStore.role !== 'manager'){ ...
- Docker 容器数据卷(Data Volume)与数据管理
卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享.通过卷,我们可以可以使修改数据直接生效,而不必 ...
- Cannot assign to read only property 'exports' of object at webpack ....BaseClient
网上找了很多资料说是import和export不能一起用,改代码 其实根本原因是es6和es5混合使用造成的兼容性问题 只需要配置.babelrc就可以了 首先安装 npm install -D tr ...
- ubuntu18.04安装fcitx
fcitx安装比较麻烦,我每次安装都要费不少劲,每次装安之后都没有写日志记录下来,导致下次装的时候又手忙脚乱,所以这次一定要记录下来. 前因: 我本来用的是ibus,但是这个输入法好像有bug,我在编 ...
- idea中无法自动提示相关jar包
遇到的问题:今天在pom.xml导入数据库坐标后,发现在在配置数据相关属性时,idea无法使用我引入的jar包,后面才发现是因为在下载包时,没网络了,jar包下载失败 解决办法:cmd进入自己的mav ...