开始一个WPF项目时的记忆重载入

目前在工业软件的UI开发方案选择中,WPF仍然是一个重要的选项。

但是其固有的复杂性,对于像我这样,并不是一直在从事界面开发的人来说,每次重启,都需要一两天的适应的时间。所以这里稍微写一个笔记。

还是老办法,学好一门技术的要点虽然很多,但大致可以简化为两步:一是基础的知识要扎实,这里的基础知识,不是说你要背熟这个相关的,而是对UI的理解,对软件开发的分工的理解。

1。 基础的UI设计哲学

(1)分工。WPF的初衷最大的来源是分工。界面的设计与 Control或序列化分离。即UI设计与程序员分离。理解这一点,是最最重要的,占75%的占比。也就是当你困惑,或都不清楚该如何选择时,都要重新到这个第一性原理这里重新思考。

(2)数据驱动。虽然我们日常的软件,往往是人为驱动。但工业软件往往相反,是数据驱动的,Monitor的时间,多于控制的时间。可以说,WPF是第一个专门在这个方向,做为设计初始目标的框架。

记住这两点,就基本上不会忘记WPF的选型要件。

2。 MVVM+datacontext

这二者其实是独立的,所以,原本应该写为三条。但也可以放在一起。data就是土壤,MV相关于土壤之下的部分,VM相当于上面的。Model-View-ViewModel 。

这里也有两点,一个是MVVM为什么要这样设计;另一个是datacontext.

这部分,每次大脑重载入时,是需要消耗一些时间的。

很重要的一个原因是,目前世界上,概念提出的多,工具开发得好的,几乎没有。微软的blend并没有实现哪怕1/10的设计目标。所以,是需要做类似本文的笔记,或者死记硬背。

(1)WPF与MVVM。要记住一点是,WPF,这三个字母的含义与MVVM没有半点关系。但是,客观来说,只要是稍微复杂一点的WPF程序,你必须用MVVM模式。

这是每次重新开始时,要重新理解的。

以往我们在MFC或者QT开发时,我们会人为加入一个MDP(这是我从华为开发L2 VPN时学到的),即消息分派中心,也就是发送方,不需要关注接收的窗口是否已被用户开启;MDP是一个大的多维矩阵(或者红黑树,B树)路由器,如果target并不存在(或者说没有到它这里注册:register),收到的消息,被吞掉,而不会调用接收方的trigger agent.

所以,如果仅仅用最基本的WPF的窗体,窗体之间的消息转发,很快你就会发现非常困难。这种困难,WPF并没有提供官方的解决方案,所以,一定要从最开始就选择MVVM模式。

或者说,WPF的Window模式,其实并不适用于工程。

它们的关系如下:

要注间我绘制的是示意图。主要是用于我自己的记忆。

我里我想强调的只有两点:一个数据的上行过程,即Model的改变,不需要通知VM,VM从INotifyPropertyChanged感知到哪些自己已注册的变量发生了变化。当然,实际上是Model触发的,但如果VM没有注册,那么就不会接收到。

第二点是DataContext的唯一性。虽然工程中,它是可以有许多个的,但我认为不需要。这是因为界面中的WPF 元素层层嵌套,一个Usercontrol嵌入另一个,即VIEW中的层次结构并不是model的hierarchy。Model侧,可以有许种类的对象,以及它们的hierarchy,但对应的上下文只需要一个。这是本文中最最重要的点。

3。 至于反方向,即从UI到model的方向的command或属性的绑定,这里不作描述了。因为我也不是很了解。

不这,这里有一个非常好的简单例程:

相关的代码:

https://download.csdn.net/download/haoyujie/89729611uhttps://download.csdn.net/download/haoyujie/89729611

总结:如果只留一点要记下来的,就是DataContext是从属于主Window的,与MVVM无关。有且只有一个。是超然的存在。

相关推荐
The Sheep 20234 小时前
WPF自定义路由事件
大数据·hadoop·wpf
阳光雨滴4 小时前
使用wpf用户控件编程落石效果动画
c++·wpf
wuty0075 小时前
WPF 调用 ChangeWindowMessageFilterEx 修改指定窗口 (UIPI) 消息筛选器的用户界面特权隔离
wpf·sendmessage·changewindowmessagefilterex·uip·消息筛选器的用户界面特权隔离·window message
攻城狮CSU11 小时前
WPF中核心接口 INotifyPropertyChanged
wpf
c#上位机11 小时前
wpf之Interaction.Triggers
c#·wpf
是木子啦15 小时前
wpf passwordbox控件 光标移到最后
c#·wpf
The Sheep 202315 小时前
wpf 命令理解
wpf
布伦鸽15 小时前
C# WPF DataGrid使用Observable<Observable<object>类型作为数据源
开发语言·c#·wpf
分布式存储与RustFS1 天前
告别复杂配置:用Milvus、RustFS和Vibe Coding,60分钟DIY专属Chatbot
wpf·文件系统·milvus·对象存储·minio·rustfs·vibe
攻城狮CSU2 天前
WPF 绑定机制实现原理
wpf