C# WPF MVVM模式Prism框架从零搭建(经典)
01前言
目前最新的PRISM的版本是8.1.97,本节以6.3.0.0 讲解,可以在Github上获取PRISM的源码。
Prism要用到IOC容器,提供选择的有Unity和MEF,这里我分别采用MEF和unity去做。
02安装库
在nuget上安装Prism相关常用的库
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中:
-
[]
-
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
-
{
-
[]
-
[]
-
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));
-
-
}
-
[]
-
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结果演示
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfkcaf
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13