本文参考Prism官网示例

创立Prism我的项目

  1. 将App.xaml中的WPF规范Application替换为PrismApplication,移除StartupUri属性;
  2. 将App.xaml.cs中的基类改为PrismApplication;
  3. 必须实现PrismApplication中的两个形象办法:RegisterTypes、CreateShell;
  4. RegisterTypes用来注册类型;
  5. CreateShell用来创立程序主窗口。

Region应用

  1. 在view xaml文件中应用prism:RegionManager.RegionName="SomeRegion"标记region;
  2. 创立自定义RegionAdapter类,继承自RegionAdapterBase<T>,override Adapt和CreateRegion办法;
  3. 在App.xaml.cs中通过override ConfigureRegionAdapterMappings办法注册自定义RegionAdapter,示例如下:
protected override void ConfigureRegionAdapterMappings(    RegionAdapterMappings regionAdapterMappings){    base.ConfigureRegionAdapterMappings(regionAdapterMappings);    regionAdapterMappings.RegisterMapping(        typeof(StackPanel), Container.Resolve<StackPanelRegionAdapter>());}

View注入Region

有两种办法,第一种称为View Discovery,该办法实用于当region加载时就把视图注入到region场景;另外一种办法称为View Injection,该办法实用于当激发某一事件后view注入到region场景。

View Discovery

通过如下办法实现:

regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA));
View Injection

通过如下办法实现,并可通过IRegion的Activate与Deactivate接口实现view的使能:

private void Button_Click(object sender, RoutedEventArgs e){    var view = _container.Resolve<ViewA>();    IRegion region = _regionManager.Regions["ContentRegion"];    region.Add(view);}private void Button_Click(object sender, RoutedEventArgs e){    //activate view a    _region.Activate(_viewA);}private void Button_Click_1(object sender, RoutedEventArgs e){    //deactivate view a    _region.Deactivate(_viewA);}

增加视图模块

  1. 增加我的项目,在我的项目中增加继承自IModule的类,实现OnInitialized与RegisterTypes办法。个别在OnInitialized中增加View Discovery代码以将该模块的相干View注入到Region中;
  2. 在程序中增加模块。增加模块的形式很多,本文仅介绍应用代码的形式增加,办法如下:
// App.xaml.csprotected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog){    moduleCatalog.AddModule<ModuleA.ModuleAModule>();}

匹配ViewModels

如果不批改命名规定,在xaml中为窗口/控件增加如下属性将主动匹配viewmodel:

prism:ViewModelLocator.AutoWireViewModel="True"

能够通过如下办法批改默认的viewmodel匹配规定,仍需在xaml中配置AutoWireViewModel:

// App.xaml.csprotected override void ConfigureViewModelLocator(){    base.ConfigureViewModelLocator();    ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver(        (viewType) =>    {        var viewName = viewType.FullName;        var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;        var viewModelName = $"{viewName}ViewModel, {viewAssemblyName}";        return Type.GetType(viewModelName);    });}

若不想批改匹配规定,且viewmodel名称不匹配默认规定,可通过如下形式匹配,仍需在xaml中配置AutoWireViewModel:

protected override void ConfigureViewModelLocator(){    base.ConfigureViewModelLocator();        ViewModelLocationProvider.Register<MainWindow, CustomViewModel>();}