C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism
阅读原文时间:2022年04月04日阅读:1

这个项目演示了如何在WPF中使用各种Prism功能的示例。如果您刚刚开始使用Prism,建议您从第一个示例开始,按顺序从列表中开始。每个示例都基于前一个示例的概念。

此项目平台框架:.NET Core 3.1

Prism版本:8.0.0.1909

提示:这些项目都在同一解决方法下,需要依次打开运行,可以选中项目-》右键-》设置启动项目,然后运行:

Topic

描述

Bootstrapper and the Shell

创建一个基本的引导程序和shell

Regions

创建一个区域

Custom Region Adapter

为StackPanel创建自定义区域适配器

View Discovery

使用视图发现自动注入视图

View Injection

使用视图注入手动添加和删除视图

View Activation/Deactivation

手动激活和停用视图

Modules with App.config

使用应用加载模块。配置文件

Modules with Code

使用代码加载模块

Modules with Directory

从目录加载模块

Modules loaded manually

使用IModuleManager手动加载模块

ViewModelLocator

使用ViewModelLocator

ViewModelLocator - Change Convention

更改ViewModelLocator命名约定

ViewModelLocator - Custom Registrations

为特定视图手动注册ViewModels

DelegateCommand

使用DelegateCommand和DelegateCommand

CompositeCommands

了解如何使用CompositeCommands作为单个命令调用多个命令

IActiveAware Commands

使您的命令IActiveAware仅调用激活的命令

Event Aggregator

使用IEventAggregator

Event Aggregator - Filter Events

订阅事件时筛选事件

RegionContext

使用RegionContext将数据传递到嵌套区域

Region Navigation

请参见如何实现基本区域导航

Navigation Callback

导航完成后获取通知

Navigation Participation

通过INavigationAware了解视图和视图模型导航参与

Navigate to existing Views

导航期间控制视图实例

Passing Parameters

将参数从视图/视图模型传递到另一个视图/视图模型

Confirm/cancel Navigation

使用IConfirmNavigationReqest界面确认或取消导航

Controlling View lifetime

使用IRegionMemberLifetime自动从内存中删除视图

Navigation Journal

了解如何使用导航日志

① BootstrapperShell启动界面:

这个主要演示Prism框架搭建的用法:

step1:在nuget上引用Prsim.Unity

step2:修改App.xaml:设置引导程序


</Application.Resources>  

public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);

        var bootstrapper = new Bootstrapper();  
        bootstrapper.Run();  
    }  
}

  step3:在引导程序中设置启动项目:

using Unity;
using Prism.Unity;
using BootstrapperShell.Views;
using System.Windows;
using Prism.Ioc;

namespace BootstrapperShell
{
class Bootstrapper : PrismBootstrapper
{
protected override DependencyObject CreateShell()
{
return Container.Resolve();
}

    protected override void RegisterTypes(IContainerRegistry containerRegistry)  
    {

    }  
}  

}

  step4:在MainWindow.xaml中显示个字符串

  ②ViewInjection:视图注册

MainWindow.xaml:通过ContentControl 关联视图

  MainWindow.xaml.cs:鼠标点击后通过IRegion 接口注册视图

public partial class MainWindow : Window
{
IContainerExtension _container;
IRegionManager _regionManager;

    public MainWindow(IContainerExtension container, IRegionManager regionManager)  
    {  
        InitializeComponent();  
        \_container = container;  
        \_regionManager = regionManager;  
    }

    private void Button\_Click(object sender, RoutedEventArgs e)  
    {  
        var view = \_container.Resolve<ViewA>();  
        IRegion region = \_regionManager.Regions\["ContentRegion"\];  
        region.Add(view);  
    }  
}

  ③ActivationDeactivation:视图激活和注销

MainWindow.xaml.cs:这里在窗体构造函数中注入了一个容器扩展接口和一个regin管理器接口,分别用来装载视图和注册regin,窗体的激活和去激活分别通过regions的Activate和Deactivate方法实现

public partial class MainWindow : Window
{
IContainerExtension _container;
IRegionManager _regionManager;
IRegion _region;

    ViewA \_viewA;  
    ViewB \_viewB;

    public MainWindow(IContainerExtension container, IRegionManager regionManager)  
    {  
        InitializeComponent();  
        \_container = container;  
        \_regionManager = regionManager;

        this.Loaded += MainWindow\_Loaded;  
    }

    private void MainWindow\_Loaded(object sender, RoutedEventArgs e)  
    {  
        \_viewA = \_container.Resolve<ViewA>();  
        \_viewB = \_container.Resolve<ViewB>();

        \_region = \_regionManager.Regions\["ContentRegion"\];

        \_region.Add(\_viewA);  
        \_region.Add(\_viewB);  
    }

    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);  
    }

    private void Button\_Click\_2(object sender, RoutedEventArgs e)  
    {  
        //activate view b  
        \_region.Activate(\_viewB);  
    }

    private void Button\_Click\_3(object sender, RoutedEventArgs e)  
    {  
        //deactivate view b  
        \_region.Deactivate(\_viewB);  
    }  
}

  ④UsingEventAggregator:事件发布订阅

事件类定义:

public class MessageSentEvent : PubSubEvent
{
}

  注册两个组件:ModuleA和ModuleB

protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
moduleCatalog.AddModule();
moduleCatalog.AddModule();
}

  ModuleAModule 中注册视图MessageView

public class ModuleAModule : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
var regionManager = containerProvider.Resolve();
regionManager.RegisterViewWithRegion("LeftRegion", typeof(MessageView));
}

    public void RegisterTypes(IContainerRegistry containerRegistry)  
    {

    }  
}

  MessageView.xaml:视图中给button俺妞妞绑定命令