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。