【1】先完成基本的環境搭建,可參考C#-WPF-Prism.DryIoc-【1】環境搭建 - 輕吟淺唱,驀然花開 - 博客園 (cnblogs.com)
【2】在解決方案中建立三個項目如下圖
其中Module1和Module2是分離出來的兩個模塊輸出類型為dll,模塊1中的Module1View和模塊2中的Module2View是需要被主項目調用和顯示的頁面(Module1View和Module2View都為UserControl)
【3】編輯主項目中的MainView.xaml 放兩個按鈕(來切換兩個模塊中的頁面)並綁定命令和參數,放一個ContentControl用來承載模塊中的頁面。代碼如下
<Window x:Class="Wpf_Prism.DryIoc_Module.Views.MainView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Wpf_Prism.DryIoc_Module.Views" xmlns:prism="http://prismlibrary.com/" mc:Ignorable="d" Title="MainView" Height="450" Width="800"> <DockPanel> <UniformGrid Columns="2" DockPanel.Dock="Top"> <Button Content="Module1" Command="{Binding OpenModuleViewCommand}" CommandParameter="Module1View"/> <Button Content="Module2" Command="{Binding OpenModuleViewCommand}" CommandParameter="Module2View"/> </UniformGrid> <!--用來承載各個模塊的的View--> <ContentControl prism:RegionManager.RegionName="MainContentRegion"/> </DockPanel> </Window>
【4】編輯主項目MainView.xaml 對應的MainViewModel.cs 添加相應的命令,以及注入IRegionManager。代碼如下:
using Prism.Commands; using Prism.Regions; namespace Wpf_Prism.DryIoc_Module.ViewModels { public class MainViewModel { private readonly IRegionManager regionManager; public DelegateCommand<string> OpenModuleViewCommand { get; private set; } public MainViewModel(IRegionManager regionManager) { OpenModuleViewCommand = new DelegateCommand<string>(OpenModuleView); this.regionManager = regionManager; } private void OpenModuleView(string obj) { regionManager.Regions["MainContentRegion"].RequestNavigate(obj); } } }
【5】配置Module1和Module2
1.分別為Module1和Module2項目安裝包 Prism.DryIoc
2.編輯Module1項目中Module1View.xaml 添加一個文本 加以區分
<Grid> <TextBlock FontSize="55" Text="我是Module1的View"/> </Grid>
3.在Module1項目下的ViewModels下添加一個Module1ViewProfile類繼承自IModule接口並實現。代碼如下:
using Module1.Views; using Prism.Ioc; using Prism.Modularity; namespace Module1.ViewModels { public class Module1ViewProfile : IModule { public void OnInitialized(IContainerProvider containerProvider) { } public void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterForNavigation<Module1View, Module1ViewModel>(); } } }
4.同理配置Module2項目,配置完成之后 項目結構為下圖
【6】修改主項目中的App.xaml.cs類重寫ConfigureModuleCatalog方法,代碼如下
注意:要引用Module1和Module2的命名空間
using Module1.ViewModels; using Module2.ViewModels; using Prism.Ioc; using Prism.Modularity; using System.Windows; using Wpf_Prism.DryIoc_Module.Views; namespace Wpf_Prism.DryIoc_Module { /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App { protected override Window CreateShell() { return Container.Resolve<MainView>(); } protected override void RegisterTypes(IContainerRegistry containerRegistry) { } //方式1 protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { moduleCatalog.AddModule<Module1ViewProfile>(); moduleCatalog.AddModule<Module2ViewProfile>(); base.ConfigureModuleCatalog(moduleCatalog); } //方式2 如果不用 引用庫的方式 可以重寫此方法 把dll 放在同一文件夾 //protected override IModuleCatalog CreateModuleCatalog() //{ // //此 模塊注入方式 是把所有相關的dll放在統一文件夾 Modules下,會檢索所有實現了IModule接口的類,注冊到容器 // return new DirectoryModuleCatalog { ModulePath = @".\Modules" }; //} } }
【7】到此Prism的基本模塊化配置完成,運行項目,效果如下圖:
完成,謝謝!