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\(); 是有多个的

相关推荐
技术小齐3 小时前
网络运维学习笔记(DeepSeek优化版) 024 HCIP-Datacom OSPF域内路由计算
运维·网络·学习
她说彩礼65万5 小时前
WPF Binding方式详解
java·开发语言·wpf
傻欣7 小时前
第五天 开始Unity Shader的学习之旅之Unity中的基础光照之漫反射光照模型
学习·unity·游戏引擎
雨出8 小时前
算法学习第十六天:动态规划(补充题目)
学习·算法·动态规划
云上艺旅9 小时前
K8S学习之基础五十四:jenkins新建测试流水线
学习·云原生·容器·kubernetes·jenkins
赛卡9 小时前
“自动驾驶背后的数学” 专栏导读
人工智能·pytorch·python·学习·机器学习·自动驾驶·numpy
May Hacker10 小时前
Apache Doris学习
学习·apache
代码AC不AC10 小时前
【数据结构】单链表
c语言·数据结构·学习·单链表·深度解析
云上艺旅10 小时前
K8S学习之基础五十三:k8s配置jenkins中的harbor
学习·云原生·容器·kubernetes·jenkins
阿维同学10 小时前
阿里巴巴1688类网站高保真原型设计
网络·学习