Prism.WPF -- Prism框架使用(上)

本文参考Prism官方示例git

建立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场景。github

View Discovery

经过以下方法实现:app

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

经过以下方法实现,并可经过IRegion的Activate与Deactivate接口实现view的使能:ide

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.cs
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
    moduleCatalog.AddModule<ModuleA.ModuleAModule>();
}

匹配ViewModels

若是不修改命名规则,在xaml中为窗口/控件添加以下属性将自动匹配viewmodel:code

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>();
}
相关文章
相关标签/搜索