打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism
--概述
这个项目演示了如何在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<T>
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 x:Class="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">    <Application.Resources>             </Application.Resources></Application>
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<MainWindow>(); }
protected override void RegisterTypes(IContainerRegistry containerRegistry) { } }}
step4:在MainWindow.xaml中显示个字符串
<Window x:Class="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"> <Grid> <ContentControl Content="Hello from Prism" /> </Grid></Window>
②ViewInjection:视图注册
MainWindow.xaml:通过ContentControl 关联视图
<Window x:Class="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"> <DockPanel LastChildFill="True"> <Button DockPanel.Dock="Top" Click="Button_Click">Add View</Button> <ContentControl prism:RegionManager.RegionName="ContentRegion" /> </DockPanel></Window>
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<string>    {    }
注册两个组件:ModuleA和ModuleB
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)        {            moduleCatalog.AddModule<ModuleA.ModuleAModule>();            moduleCatalog.AddModule<ModuleB.ModuleBModule>();        }
ModuleAModule 中注册视图MessageView
public class ModuleAModule : IModule { public void OnInitialized(IContainerProvider containerProvider) { var regionManager = containerProvider.Resolve<IRegionManager>(); regionManager.RegisterViewWithRegion("LeftRegion", typeof(MessageView)); }
public void RegisterTypes(IContainerRegistry containerRegistry) { } }
MessageView.xaml:视图中给button俺妞妞绑定命令
<UserControl x:Class="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"> <StackPanel> <TextBox Text="{Binding Message}" Margin="5"/> <Button Command="{Binding SendMessageCommand}" Content="Send Message" Margin="5"/> </StackPanel></UserControl>
MessageViewModel.cs:在vm中把界面绑定的命令委托给SendMessage,然后在方法SendMessage中发布消息:
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<MessageSentEvent>().Publish(Message); } }}
在MessageListViewModel 中接收并显示接收到的消息:
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<MessageSentEvent>().Subscribe(MessageReceived); }
private void MessageReceived(string message) { Messages.Add(message); } }
以上就是这个开源项目比较经典的几个入门实例,其它就不展开讲解了,有兴趣的可以下载源码自己阅读学习。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
WPF开发之Prism详解【内附源码】
.NET Core 3 WPF MVVM框架 Prism系列之区域管理器
.NET Core 3 WPF MVVM框架 Prism系列之对话框服务
Prism学习(6)---Shell Region View
.NET Core 3 WPF MVVM框架 Prism系列之导航系统
VB.net学习笔记(十七)XAML
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服