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

Posted on 2022-04-20 15:23  轻吟浅唱,蓦然花开  阅读(1904)  评论(1编辑  收藏  举报

【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的基本模块化配置完成,运行项目,效果如下图:

完成,谢谢!