WPF框架学习

WPF 可以想winfrom 那样在cs文件修改 属性数据;

为了前后端分离 而解耦合,有了M-V-VM模式

常见框架有 MVVMlight / Prism 等


一、前提:有一定基础,学会数据绑定

1.数据绑定

关键字 Binding

绑定源(ViewModel)绑定源中要使用的值的路径(VM的某个属性)

绑定目标对象 绑定目标对象的属性

绑定目标对象的属性 为依赖属性。

绑定源 不限于自定义的.net对象。

DataContext

总结:Model在ViewModel中,ViewModel在View的DataContext中,View引用Model(通过绑定)。

建立ViewModel类

新建一个类,继承实现INotifyPropertyChanged接口

INotifyPropertyChanged接口是 WPF 和其他支持数据绑定的 UI 框架中常用的一个接口,用于通知客户端(如 UI 控件)属性值已更改。

命名空间:

using System.ComponentModel;

using System.Runtime.CompilerServices;

实现接口+定义通知函数:

固定代码片段(可以把重复固定的代码做一个VM基类,让其它具体的VM类继承扩展)

用于改变时 VM类对象 通知 View类对象;或者反之;

CallerMemberName\]特性谁改变传参谁。 > public event PropertyChangedEventHandler PropertyChanged; > > protected virtual void OnPropertyChanged(\[CallerMemberName\] string propertyName = null) > > { > > PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); > > } 切换到view 指定上下文**DataContext** 可以写到cs文件 任意控件的DataContent 属性=new vm类 例如: > this.DataContent=new PersonViewModle(); 也可以写到XAML, 也是任意控件,影响控件范围和样式一样,例如: > \ > > \<命名空间:PersonViewModle/\> > > \ 加控件绑定这个ViewModle,比如可以改文本的控件 > \ > > 或者 > > \ > > 后者不会发出事件,正常是使用前者,按需使用 运行程序,改变 -------------------------------------------------- 绑定源未精通,参考[78. MVVM - Binding RelativeSource四种模式_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1Ex4y1Y7Y8/?p=79&spm_id_from=pageDriver&vd_source=7131bd5d24cfefde3fce7ab6d1686c4d "78. MVVM - Binding RelativeSource四种模式_哔哩哔哩_bilibili") 关键字 绑定**Binding** 和模板绑定**TemplateBinding** 依赖属性={Binding RelativeSource={RelativeSource Mode=TemplatedParent},。。。可以简写成 依赖属性={TemplateBinding Property= Content}。。。 绑定的相关设置: (1)绑定模式(2)绑定 转换器 ,多值转换器(3) 值的数据校验(4)命令command 命令command 把事件转化成一个个命令 命令目标,未设置时,谁有焦点(点了谁),谁就是目标 ------------------------------------------------------------------------------- 多少个页面就有多少个VM ?怎么理解? ++++++++++++++++++++++++++++ ## 另开一篇[01-Prism框架中数据与命令基本使用_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1nRsteTEoM/?p=2&spm_id_from=pageDriver&vd_source=7131bd5d24cfefde3fce7ab6d1686c4d "01-Prism框架中数据与命令基本使用_哔哩哔哩_bilibili") Prism 框架 1.安装 Prism.core 和wpf 2.新建主界面的viewModel类 继承Prism.Mvvm.BindableBase (1)看看继承的父类 实现通知接口外,还有 RaisePropertyChanged() 提醒场景变更? +返回bool 的SetProperty\()两个(参数不同,方法重载)来设置属性 (2)快捷片段 porpfull ,也可以自定义代码片段,把set 方法内容改成SetProperty\(ref _xxx,xxx) ![](https://i-blog.csdnimg.cn/direct/0cf3a7dcd0564c42bd45f5b2c25b3b36.png) (3)xaml 或代码指定 DataContext 3.在当前VM类 定义命令 DeleaateCommand / DelegateCommand\ (1)自定义代码片段 mycmd > \ > > \ > > \ > > \ > > \mycmd\ > > \mycmd\ > > \Prism VM类的 命令自定义 的代码片段\ > > \Microsoft Corporation\ > > \ > > \Expansion\ > > \ > > \ > > \ > > \ > > \ > //命令属性定义 > > public DelegateCommand XxxCommand { get; set; } > > public MainViewModel() > > { > > XxxCommand = new DelegateCommand( > > ()=\>{ } > > ); > > } > > \]\]\> > > \ > > \ > > \ > > \ +++++++++++++++++++++++++++++++++ 另开一篇 [3.创建Prism应用程序_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1Ei4y1F7du?p=3&spm_id_from=pageDriver&vd_source=7131bd5d24cfefde3fce7ab6d1686c4d "3.创建Prism应用程序_哔哩哔哩_bilibili") 1.安装 Prism.DryIoc(8.0版本比Prism.unity版本好) 会自动安装Prism.wpf 细节参考:[wpf使用prism框架Dryioc容器实现导航 wpf prism教程_mob6454cc73e9a6的技术博客_51CTO博客](https://blog.51cto.com/u_16099296/10854026 "wpf使用prism框架Dryioc容器实现导航 wpf prism教程_mob6454cc73e9a6的技术博客_51CTO博客") (问题:我当前只有9.0版本,无法在.net frameword4.6.2安装(教程是vs2019.net core),卡半天还失败了,没翻墙,Uinty可以安装。 填坑:最后我连上对应网络后,.net frameword 和.net9.0都可以了,而且提示比Uinty多) 2. 改成Prism 框架,app的xaml 、 cs文件 改成继承 PrismApplication 和实现接口 > 1. 继承PrismApplication 和引用命名空间 > > 2. xmlns:prism="http://prismlibrary.com/" 上面引用后才可以在xaml文件有这个提示 > > 3. app.xaml 控件 Application 换成prism:PrismApplication > > 4. cs文件实现接口.9.0以上版本,不需要,先重新生成 启动后正常。 3. 看代码PrismApplication类,是继承Application类,重新了初始化等函数和封装 4. 框架模板的使用 (1)**扩展(X)** - **管理扩展(M)** ,出现和vs code类似的扩展,查找Prism ,安装**Prism Template Pack**(一直在安装中的话,要进入浏览器下载exe安装,我下载的2个扩展都是这样) (2)安装完毕,新建项目时 可以选择新的模板,和本地模板差不多,选WPF空模板,建立好之后和上面自行修改的一样 5.Region 区域 问题:.net framework4.6.2等版本无法正常启动,尝试 重装,清理生成都不行,.net 6.0可以 解决: 尝试把首选32位去掉,之后正常了,可能包含不能再32位运行的代码或程序 继续 可以在xaml 或 VM类文件 注册区域 xaml > \\ > public partial class MainWindow : Window > > { > > **private readonly IRegionManager regionManager;** > > public MainWindow() > > { > > InitializeComponent(); > > } > > **public MainWindow(IRegionManager p_regionManager) > { > InitializeComponent(); > this.regionManager = p_regionManager; > RegionManager.SetRegionName(ctr, "ContentRegion");** > > **}** > > > } > > 坑:教程不是.net framework,也不是vs工具,可以省略而不报错,我的要补回去,不能在原来的加参数 上面又遇到问题,显示不出动态内容ViewA.xaml 填坑上面异常: 单单在xaml写上 \ \\ \ 是不行的,应该还要设置其它不了解的,反复检查一天多无果, 决定按教材里的结构来, **(1)xaml 加上主prism:ViewModelLocator.AutoWireViewModel="True"** **(2)然后文件夹加s结尾,分别是Views 和 ViewModels** (3) MainViewModel.cs 也变成 MainViewModels.cs (4) 无参的构造函数+有参的一起保留 或 像教材改成有参 都可行 **(5)注册区域导航的函数内 再加上** > **containerRegistry.RegisterForNavigation\();** **和教材不一致的这句加上,是另一个视频教材评论区说要加上的,经测现在的9.0版本要加上** (6)**MainViewModel.cs 和 MainViewModels.cs 都可以,但是都要加上第五步** **6.模块化Module 实现了IModule接口** **没看懂,随后看** **7. 区域导航** 上面区域学习基础上, **切换任意以注册的View:** regionManager.RequestNavigate("ContentRegion", p_viewName); //区域"ContentRegion"显示以注册的区域p_viewName **导航切换过程中 传参:** 例如 ViewA 对应的 ViewAViewModel.cs 继承ViewModel的基类BindableBase 再继承IConfirmNavigationRequest 方式一: var paran = new NavigationParameters(); param.Add("Parameter", param);_regionManger.RequestNavigate("RegionName", "ViewlName",param); 方式二:类似URL地址传递参数 _regionManger.RequestNavigate("RegionName", $"ViewlName?Name=xiaoming"); **导航前进后退:** MainViewModel.cs 加上 > public IRegionNavigationJournal journal; > > private void GoForword() > > { > > journal.GoForward(); > > } > > private void GoBack() > > { > > journal.GoBack(); > > } **8.对话服务Dialog** 什么是Dialog?对话框实际上是我们应用程序经常用到的一个功能类如:Show、ShowDialog。可以弹出一个我们指定的窗口,仅此而已 messageViewModel.cs 继承BindableBase, **==============** 上面没课件资料,视频不细看,重开别的教材 [15.Prism区域介绍(2)_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1nY411a7T8?p=15&spm_id_from=pageDriver&vd_source=7131bd5d24cfefde3fce7ab6d1686c4d "15.Prism区域介绍(2)_哔哩哔哩_bilibili") 1. 动态资源和静态资源 区别:静态的给了一次之后就固定了,动态的还可以有二次改变,静态的二次设置不会变 **==============================** ## 另一个 [03-Prism框架中的事件总线-消息_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV13Sm5YXEMz?spm_id_from=333.788.videopod.episodes&vd_source=7131bd5d24cfefde3fce7ab6d1686c4d&p=4 "03-Prism框架中的事件总线-消息_哔哩哔哩_bilibili") ### **1.事件总线/**事件聚合器(IEventAggregator) **(1)消息** > **public MainView(IEventAggregator xxx){ }** **直接运行报错,要Prism框架的IOC传参进来,** ![](https://i-blog.csdnimg.cn/direct/02ea00627a0b469a873e97c9f8487177.png) 注释的和没注释的选其一都有参数传入 ![](https://i-blog.csdnimg.cn/direct/5a095bf966a74aedbdf55e69869292b7.png) 而return Container.Resolve\(); 是有多个的

相关推荐
Scout-leaf8 天前
WPF新手村教程(三)—— 路由事件
c#·wpf
西岸行者10 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意10 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码10 天前
嵌入式学习路线
学习
毛小茛10 天前
计算机系统概论——校验码
学习
babe小鑫10 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms10 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下10 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。10 天前
2026.2.25监控学习
学习
im_AMBER10 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode