C#-Wpf-Prism.DryIoc-【4】模塊化


【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的基本模塊化配置完成,運行項目,效果如下圖:

完成,謝謝!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM