C# WPF MVVM模式Prism框架从零搭建(经典)

01

前言

目前最新的PRISM的版本是8.1.97,本节以6.3.0.0 讲解,可以在Github上获取PRISM的源码。

  • Prism Github地址:https://github.com/PrismLibrary/Prism

  • Prism官方文档:https://prismlibrary.com/docs/

  • Prism要用到IOC容器,提供选择的有Unity和MEF,这里我分别采用MEF和unity去做,不懂MEF的建议看看这位大牛的系列博文http://www.cnblogs.com/yunfeifei/p/3922668.html

02


安装库

在nuget上安装Prism相关常用的库

00c385b40120d12f346f8fb8e3a2d4e7.png

03


项目搭建

step1:新建解决方案:我这里命名为PrismFrameTest;

step2:删除MainWindow.xaml,删除App.xaml中启动引导

StartupUri="MainWindow.xaml"

然后在App.xaml.cs新建程序入口

protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);MyBootstrapper bootStrapper = new MyBootstrapper();bootStrapper.Run(true);}

新建引导类MyBootstrapper.cs,需要继承基类Prism.Mef库下的基类MefBootstrapper

方式1 采用mef

public class MyBootstrapper : MefBootstrapper{protected override DependencyObject CreateShell(){return this.Container.GetExportedValue<MyShellView>();}protected override void InitializeShell(){base.InitializeShell();Application.Current.MainWindow = (MyShellView)this.Shell;Application.Current.MainWindow.Show();//Show主窗口,但content内没有内容,只有当调用Module中的Initialize()方法后才将HelloWorldView显示出来。}protected override void ConfigureAggregateCatalog(){base.ConfigureAggregateCatalog();this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(MyBootstrapper).Assembly));this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(PrismModuleLeft.ModuleLeftViewModel).Assembly));//注册模块//this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ModuleB.ModuleBViewModel).Assembly));}protected override IModuleCatalog CreateModuleCatalog(){// When using MEF, the existing Prism ModuleCatalog is still the place to configure modules via configuration files.return new ConfigurationModuleCatalog();}}

方式2 采用unity

public class MyBootstrapper : UnityBootstrapper{protected override DependencyObject CreateShell(){return Container.Resolve<MyShellView>();}protected override void InitializeShell(){base.InitializeShell();Application.Current.MainWindow = (MyShellView)this.Shell;Application.Current.MainWindow.Show();//Show主窗口,但content内没有内容,只有当调用Module中的Initialize()方法后才将HelloWorldView显示出来。}protected override void ConfigureModuleCatalog(){base.ConfigureModuleCatalog();ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;moduleCatalog.AddModule(typeof(PrismModuleLeft.ModuleLeftViewModel));//注册模块}}

step3:

然后新建一个xaml窗体MyShellView.xaml,将窗体分为左右两部分

这里cal:RegionManager.RegionName是一个依赖属性,我们将它与ItemsControl控件相关联,MainRegion就是一个占位符。

<ItemsControl cal:RegionManager.RegionName="RegionLeft" HorizontalAlignment="Center" VerticalAlignment="Center"/><ItemsControl cal:RegionManager.RegionName="RegionRight" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="1"/>

对应的cs中将类标注为  [Export]

step4:新建类库PrismModuleLeft

类库中新建ModuleLeftView.xaml

关于事件绑定:(在下面代码中两种方式都列出来了)

①控件继承自ButtonBase、MenuItem类,比如:Button、RadioButton、Hyperlink、MenuItem……这种情况下,由于Prism已经帮我们实现了这些控件的Command属性,可以直接绑定Command属性来完成Click事件到ViewModel的绑定:

②ListView、ListBox、DropDownList等等大部分没有Click事件的控件。这时候,当我们要实现SelectedItemChanged、SelectionChanged等常用事件的时候,使用Expression Blend附带的System.Windows.Interactivity.dll文件,它使用interaction trigger和InvokeCommandAction behavior来帮助我们直接绑定控件的事件。

需要引用

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
<Grid><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><TextBlock  Foreground="Red" FontSize="20" Text="{Binding TxtLabel}" Background="Gray" Grid.Row="0"/><Button Background="LightCyan" Name="CreateRecipe" Command="{Binding CreateRecipeCommand}" Content="BtnCtr" FontSize="20" Grid.Row="1"><i:Interaction.Triggers ><i:EventTrigger EventName="PreviewKeyDown"><i:InvokeCommandAction Command="{Binding KeyUpEventCommand}" /></i:EventTrigger></i:Interaction.Triggers></Button></Grid>

对应的cs中:

[Export]public partial class ModuleLeftView : UserControl{private readonly IRegionViewRegistry regionViewRegistry;public ModuleLeftView(){InitializeComponent();this.DataContext = new ModuleLeftViewModel(regionViewRegistry);}}

step4:ModuleLeftViewModel中:

using Prism.Commands;
using Prism.Mef.Modularity;
using Prism.Modularity;
using Prism.Mvvm;
using Prism.Regions;
using PropertyChanged;
using System.ComponentModel.Composition;
using System.Windows;
using System.Windows.Input;namespace PrismModuleLeft
{[AddINotifyPropertyChangedInterface][ModuleExport("ModuleLeftViewModel", typeof(ModuleLeftViewModel), InitializationMode = InitializationMode.WhenAvailable)]public class ModuleLeftViewModel : BindableBase,IModule{private readonly IRegionViewRegistry regionViewRegistry;public ICommand CreateRecipeCommand { get; set; }public DelegateCommand<KeyEventArgs> KeyUpEventCommand { get; private set; }public string TxtLabel { get; set; } = "Hello! I am ModuleA";public void KeyUpEventHandler(KeyEventArgs args){MessageBox.Show("PrismCTR");}public void Initialize(){regionViewRegistry.RegisterViewWithRegion("RegionLeft", typeof(ModuleLeftView));}[ImportingConstructor]public ModuleLeftViewModel(IRegionViewRegistry registry){this.regionViewRegistry = registry;CreateRecipeCommand = new DelegateCommand(() => CreateRecipe());         }public void CreateRecipe(){TxtLabel = "this is my first prism test example";MessageBox.Show(TxtLabel);}}
}

04


总结

这个时候我们来对PRISM的基础架构做一个简单的总结:

Shell: 主窗口,他的功能都是通过Module来实现的;

Bootstrapper: 应用程序的入口点;

Region: 内容区域,类似于一个占位符

Module: 真正实现业务功能的东西,是View,数据,模型组成的集合;

Prism是个非常强大的wpf mvvm模式框架,它使用依赖注入,控制反转容器来帮助我们解决团队合作的松耦合问题。

05


结果演示

267b3c6efa262b7d320f2a52939db647.gif

05


源码

链接:https://pan.baidu.com/s/1utVT-087R1WonjoHZrv_Iw

提取码:在下面公众号后台,发送:提取码,即可获取

技术群: 需要进技术群的添加小编微信zls20210502 ,备注:加群;

06


经典回顾

      因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“赞”和“在看”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点击“赞”和“在看”支持我们吧!

往期推荐

C# WPF框架Caliburn.Micro入门实例1

C# WPF MVVM项目实战(进阶①)

C# WPF MVVM项目实战(进阶②)

C# WPF框架Caliburn.Micro快速搭建

C# WPF项目实战

C# WPF mvvm模式下combobox绑定(list<enum>、Dictionary<int,string>)

C# WPF MVVM模式下在主窗体显示子窗体并获取结果

C# WPF Caliburn.Micro框架下利用Mef加载其它项目界面

C# WPF文本框TextEdit不以科学计数法显示

C# 通过正则表达式来限制控件输入有效性

C# datagridview、datagrid、GridControl增加行号

C# =>符号的使用

C# 无意间写了一段线程死锁的代码

C# 看懂这100+行代码,你就真正入门了(经典)

C# WPF项目实战(经典)

WPF 如何修改button圆角(经典)

WPF XAML 为项目设置全局样式

12928390b03c2090c8535c242048a823.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在中国,有这样一些村落

全世界只有3.14 % 的人关注了爆炸吧知识01地坑村在河南有一个全球最神奇的村落这村子神奇就神奇在当你走进村子能听到家家户户的吵闹声却见不到一座房子原来村落居然建在地底下基本不用与外界接触但村子却被外国媒体争相报道火的一塌糊涂更不可思议的是村里的老人平均寿命都超1…

2-2

为方便储户&#xff0c;某银行拟开发计算机储蓄系统。储户填写的存款单或取款单由业务员输入系统&#xff0c;如果是存款&#xff0c;系统记录存款人姓名、住址、存款类型、存款日期、利率等信息&#xff0c;并印出存款单给储户&#xff1b;如果是取款&#xff0c;系统计算利息…

.NET 6新特性试用 | 隐式using指令

前言在使用《最小Web API》时&#xff0c;我们发现&#xff0c;相比以前的代码&#xff0c;大量的using指令消失了&#xff1a;using指令的主要作用是允许使用在命名空间中定义的类型&#xff0c;而无需指定该类型的完全限定命名空间。那么&#xff0c;在.NET 6下为什么不需要了…

6部有生之年必看的BBC “教材级” 地理纪录片,免费领取!

看BBC的纪录片&#xff0c;既可以追溯上下数千年的历史文化&#xff0c;也可以欣赏从宇宙到地心深处的奇妙境界&#xff0c;而及其超级精彩的画面即使定格&#xff0c;也是一幅摄影佳作。BBC纪录片题材广泛、制作精良&#xff0c;观看起来算的上是赏心悦目。对于学习英文&#…

blazor wasm开发chrome插件

用blazor(Wasm)开发了一个chrome插件感觉效率挺高的&#xff0c;分享给大家先简单介绍下WebAssembly的原理&#xff1a;“WebAssembly是一种用于基于堆栈的虚拟机的二进制指令格式”image如上图&#xff0c;浏览器在执行js时是会经历 Parser转成语法树->Compiler转成字节码-…

求偶的两种方法

import java.util.Scanner;public class Testif {public static void main(String[] args) {// TODO 自动生成的方法存根Scanner scan new Scanner(System.in);System.out.println("请输入一个整数&#xff1a;");long number scan.nextLong(36);String check (numbe…

idea zookeeper的使用_学习ZooKeeper源码,就从这篇开始吧

【ZooKeeper系列】1.ZooKeeper单机版、伪集群和集群环境搭建【ZooKeeper系列】2.用Java实现ZooKeeper API的调用在系列的前两篇文章中&#xff0c;介绍了ZooKeeper环境的搭建(包括单机版、伪集群和集群)&#xff0c;对创建、删除、修改节点等场景用命令行的方式进行了测试&…

都才40出头,近一个月已有至少5名优秀青年学者英年早逝!健康不容忽视

全世界只有3.14 % 的人关注了爆炸吧知识近年来&#xff0c;在工作、生活的层层重压下&#xff0c;正处于事业上升期的科研人员因病逝世的消息屡屡传出。据不完全统计&#xff0c;仅仅今年10月份至今&#xff0c;短短一个多月时间里&#xff0c;已有至少5位优秀青年学者倒下。他…

基于 Spring Security 的开源统一角色访问控制系统 URACS

URACS Java语言开发的统一角色访问控制系统(Unified Role Access Control System)&#xff0c;基于Spring Security 3实现的权限控制系统 程序框架版本说明&#xff1a;Spring MVC 3.0.6 Spring Security 3.1.3 Hibernate 3.6.10 运行演示例子&#xff1a; 例子使用的是MySQL…

Chatopera 王海良:做好开源客服系统

| 作者&#xff1a;王海良| 编辑&#xff1a;刘雪洁| 设计&#xff1a;马丽娜| 责编&#xff1a;王玥敏做好开源客服系统&#xff0c;是我最近的心心念念的事情之一。我想讲的故事&#xff0c;就包括春松客服&#xff0c;一个开源的客服系统。篇章有限&#xff0c;我想从三点来…

mysql_contents_将MySQLhelpcontents的内容有层次的输出方法推荐

经常会遇到这种情况&#xff0c;在一个不能上网的环境通过MySQL客户端登录数据库&#xff0c;想执行一个操作&#xff0c;却忘了操作的具体语法&#xff0c;各种不方便。其实&#xff0c;MySQL数据库内置了帮助文档&#xff0c;通过help contents即可查看。如下所示&#xff1a…

点开那些优秀的硕博士们的朋友圈,他们都有这些特点!

全世界只有3.14 % 的人关注了爆炸吧知识很多同学都会有这种感觉&#xff0c;读了硕士博士后&#xff0c;兴趣会突然间发生很大变化&#xff0c;发朋友圈也会不一样了。例如&#xff0c;合格的学术研究者&#xff0c;要快速、全面的获取各种最新文献和学界动态&#xff1b;还要持…

java foreach 跳过本次循环_【Java】对foreach循环的思考

阿里java开发手册已经发表&#xff0c;很多都值得认真研究思考&#xff0c;看到零度的思考题&#xff0c;没忍住研究了一下。在这里插入图片描述首先&#xff0c;看一下给出的反例的执行结果。如果是"1"&#xff0c;最后list中的元素为["2"]如果把"1&…

地球上这10个奇幻景观,带你踏入外太空

全世界只有3.14 % 的人关注了爆炸吧知识大蓝洞大蓝洞是灯塔礁的一部分&#xff0c;位于洪都拉斯伯利兹城陆地大约100公里之遥&#xff0c;是一个较大的完美环状海洋深洞&#xff0c;是当今世界最吸引人的潜水地点之一。305米的口径&#xff0c;123米的洞深&#xff0c;洞口呈现…

OSChina 周六乱弹 —— 有人骂你神经病怎么办?

2019独角兽企业重金招聘Python工程师标准>>> 周六了&#xff0c;大家有没有在认真加班呢&#xff1f;其实咱们程序员的生活真的不容易 熊大信了熊二的话&#xff1a;程序员的人生 码代码不容易&#xff0c;咱们还是去抢银行吧 sunny_chan&#xff1a;一天老师让同学…

手把手教你学Dapr - 6. 发布订阅

介绍发布/订阅模式允许微服务使用消息相互通信。生产者或发布者在不知道哪个应用程序将接收它们的情况下向主题发送消息。这涉及将它们写入输入通道。同样&#xff0c;消费者或订阅者订阅该主题并接收其消息&#xff0c;而不知道是什么服务产生了这些消息。这涉及从输出通道接收…

直男的浪漫有多可怕?

1 你不说估计没人知道&#xff08;via.信箱说i&#xff09;▼2 举报&#xff0c;此处有个疑似小偷的人&#xff01;&#xff08;via&#xff1a;不知姓名的C&#xff09;▼3 世界上最互相信任的人了吧&#xff1f;▼4 你看我这个垫肩是不是很不错&#xff01;&#xff08;素…

WPF 透明窗口在桌面上放虫子。。。

抖音上偶然看到这个&#xff0c;咱也想来一个&#xff0c;看看效果&#xff1a;实现很简单&#xff0c;一个透明窗口&#xff0c;一个gif图片&#xff0c;不显示任务栏&#xff0c;再加上鼠标穿透&#xff0c;就ok了了看看代码&#xff1a;Mainwindow.xaml:<Window x:Class&…

“凡尔赛文学”疯狂刷屏!数学家们也拼命“装”了起来,哈哈哈哈哈

全世界只有3.14 % 的人关注了爆炸吧知识凡尔赛文学与数学结合起来完美无缺大家好&#xff0c;超模君昨天在写稿时&#xff0c;表妹过来告诉我&#xff1a;“表哥你的科普文章都out了&#xff01;现在凡尔赛文学才是主流&#xff01;”超模君很疑惑&#xff0c;凡尔赛文学的画风…

.NET 6新特性试用 | 可空引用类型

前言在查看《隐式using指令》功能时&#xff0c;我们在csproj中发现这样一个属性&#xff1a;那么&#xff0c;Nullable到底是干嘛的&#xff1f;可为空上下文严格来说&#xff0c;这不是新特性&#xff0c;而是C# 8.0引入的特性之一。该特性用于指示引用类型是否接受null值:只…