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>();
}
相關文章
相關標籤/搜索