C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism

虚幻大学 xuhss 311℃ 0评论

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

--概述

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

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

Prism版本:8.0.0.1909

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

caa6ff436f844a8d03992646f1cf17b2 - C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism

目录介绍

| 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启动界面:

404c501dafbbf80d1f0678387b127a23 - C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism

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

step1:在nuget上引用Prsim.Unity

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

?

| 12345678 | "BootstrapperShell.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:BootstrapperShell"> |

  

?

| 12345678910 | public partial class App : Application{protected override void OnStartup(StartupEventArgs e){base.OnStartup(e); var bootstrapper = new Bootstrapper();bootstrapper.Run();}} |

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

?

| 123456789101112131415161718192021 | 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中显示个字符串

?

| 12345678 | "BootstrapperShell.Views.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Shell" Height="350" Width="525">"Hello from Prism" /> |

  ②ViewInjection:视图注册

ad560610b284f02ba73776d04939f7b1 - C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism

MainWindow.xaml:通过ContentControl 关联视图

?

| 12345678910 | "ViewInjection.Views.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:prism="http://prismlibrary.com/"Title="Shell" Height="350" Width="525">"True">``"Top" Click="Button_Click">Add View``"ContentRegion" /> |

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

?

| 12345678910111213141516171819 | 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();IRegion region = _regionManager.Regions["ContentRegion"];region.Add(view);}} |

  ③ActivationDeactivation:视图激活和注销

dec612eb36a7d414361e513ab6cc91bf - C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism

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

?

| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 | 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();_viewB = _container.Resolve(); _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:事件发布订阅

9dd5a7ea671730b095757dfbfdd70c7b - C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism

事件类定义:

?

| 123 | public class MessageSentEvent : PubSubEvent<string>{} |

  注册两个组件:ModuleA和ModuleB

?

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

  ModuleAModule 中注册视图MessageView

?

| 12345678910111213 | 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俺妞妞绑定命令

?

| 12345678910 | "ModuleA.Views.MessageView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:prism="http://prismlibrary.com/" prism:ViewModelLocator.AutoWireViewModel="True" Padding="25">"{Binding Message}" Margin="5"/>``"{Binding SendMessageCommand}" Content="Send Message" Margin="5"/> |

  MessageViewModel.cs:在vm中把界面绑定的命令委托给SendMessage,然后在方法SendMessage中发布消息:

?

| 1234567891011121314151617181920212223242526272829303132 | using Prism.Commands;using Prism.Events;using Prism.Mvvm;using UsingEventAggregator.Core; namespace ModuleA.ViewModels{public class MessageViewModel : BindableBase{IEventAggregator _ea; private string _message = "Message to Send";public string Message{get { return _message; }set { SetProperty(ref _message, value); }} public DelegateCommand SendMessageCommand { get; private set; } public MessageViewModel(IEventAggregator ea){_ea = ea;SendMessageCommand = new DelegateCommand(SendMessage);} private void SendMessage(){_ea.GetEvent().Publish(Message);}}} |

  在MessageListViewModel 中接收并显示接收到的消息:

?

| 123456789101112131415161718192021222324 | public class MessageListViewModel : BindableBase{IEventAggregator _ea; private ObservableCollection<string> _messages;public ObservableCollection<string> Messages{get { return _messages; }set { SetProperty(ref _messages, value); }} public MessageListViewModel(IEventAggregator ea){_ea = ea;Messages = new ObservableCollection<string>(); _ea.GetEvent().Subscribe(MessageReceived);} private void MessageReceived(string message){Messages.Add(message);}} |

  

以上就是这个开源项目比较经典的几个入门实例,其它就不展开讲解了,有兴趣的可以下载源码自己阅读学习。

源码下载

github访问速度较慢,所以我下载了一份放到的百度网盘

百度网盘链接:https://pan.baidu.com/s/10Gyks2w-R4B\_3z9Jj5mRcA

提取码:0000


开源项目链接:https://github.com/PrismLibrary/Prism-Samples-Wpf

技术群:添加小编微信并备注进群小编微信:mm1552923 公众号:dotNet编程大全

转载请注明:xuhss » C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism

喜欢 (0)

您必须 登录 才能发表评论!