本文参考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
,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.cs
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
moduleCatalog.AddModule<ModuleA.ModuleAModule>();
}
匹配ViewModels
如果不修改命名规则,在xaml中为窗口/控件添加如下属性将自动匹配viewmodel:
prism:ViewModelLocator.AutoWireViewModel="True"
可以通过如下方法修改默认的viewmodel匹配规则,仍需在xaml中配置AutoWireViewModel:
// App.xaml.cs
protected 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>();
}