本文参考Prism官网示例
创立Prism我的项目
- 将App.xaml中的WPF规范Application替换为PrismApplication,移除StartupUri属性;
- 将App.xaml.cs中的基类改为PrismApplication;
- 必须实现PrismApplication中的两个形象办法:RegisterTypes、CreateShell;
- RegisterTypes用来注册类型;
- CreateShell用来创立程序主窗口。
Region应用
- 在view xaml文件中应用
prism:RegionManager.RegionName="SomeRegion"
标记region; - 创立自定义RegionAdapter类,继承自RegionAdapterBase<T>,override Adapt和CreateRegion办法;
- 在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);}
增加视图模块
- 增加我的项目,在我的项目中增加继承自IModule的类,实现OnInitialized与RegisterTypes办法。个别在OnInitialized中增加View Discovery代码以将该模块的相干View注入到Region中;
- 在程序中增加模块。增加模块的形式很多,本文仅介绍应用代码的形式增加,办法如下:
// 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>();}