WPF知识点汇集
数据绑定Binding
原生WPF
CLR属性 ,类继承INotifyPropertyChanged,自己写事件通知
Prism框架
View层控件通过绑定Vm的可通知属性进行界面/数据更改
绑定模式有3种
OneWay单向绑定,界面更新,VM属性不更
TwoWay双向绑定,都更新
OneToSource单向绑定,界面不更,VM更
命令Command
View层控件通过绑定命令属性,触发命令方法/并可以判断是否执行
命令有3种
快捷键cmd,命令+方法
快捷键cmdfull,命令+许可
快捷键cmdg,命令+参数
资源Resources
画刷资源
可以复用的颜色模板
资源样式Style
批量给控件设置现有属性
控件模板ControlTemplate
改变控件内部架构/组成,例如自己搭建Border,Grid,TextBox组合
资源的作用范围
就近原则
控件自身 Resources → 2. 父容器 Resources → 3.Window 资源 → 4. App.xaml 应用程序级资源
资源字典
用来存放样式,控件模板
静态资源StaticResource
加载时一次性查找/绑定,之后不再区字典找,界面不会更新
动态资源DynamicResource
运行时修改资源界面自动刷新,但是更消耗资源,少用
界面引用字典用 </ResourceDictionary.MergedDictionaries> 嵌套
触发器Triggers
★以下含义仅限于触发器内:
Property,监听某属性
Value,达成某条件
Setter,执行某事
TargetName=“{要改的属性}”
自定义控件
继承Control,控件底层都是它
静态构造,OverrideMetadata 让框架自动去资源里找对应的模板
依赖属性
控件模板,界面绑定
变更回调方法签名OnMyPropertyChanged
依赖
参数d是属性的宿主控件实例
附加
参数d是被挂载的目标控件
e参数二者一样,存放新旧值和属性标识
属性
依赖属性DependencyProperty.Register()/快捷键propdp
支持绑定,动画,通知
组成
静态字段注册依赖属性
约定:字段名必须 = 属性名 + "Property"
CLR属性包装器,里面不能写逻辑
回调函数(可选)
用在哪些地方
自定义控件暴露参数
TemplateBinding绑定的是依赖属性
Trigger 只能监听依赖属性,普通属性不响应
附加属性DependencyProperty.RegisterAttached()
给别的控件外加属性,本质也是依赖属性
定义在静态类里
静态字段注册
Get,Set静态方法,不是包装器
回调(可选)
MVVM
M是Model
数据实体
单个数据可以通过VM中转
多个数据通过数据模板
V是View
界面,不认识Model,通过绑定VM属性间接通信
不能直接改属性
原生通过DataContext = VM 拿到VM实例
Prism框架通过文件名加ViewModel自动绑定
VM是ViewModel
处理界面状态和操作命令
不能直接引用控件
数据模板DataTemplate
给数据设计UI布局,模板内绑定Model,一套模板套多套数据
一般用在集合控件/表格中
不用自己再给数据添控件,每条数据自动生成卡片
配合数据的变化实现界面颜色字体的变化
数据触发器DataTrigger
绑定Model里的某个值,进行监视
Value设定触发值
Setter实现某事
转换器
继承IValueConverter
实现Convert正向转换
把值转换成字符串
Model的值传进来,显示到界面
实现ConvertBack反向转换
把字符串转换成值
用户界面改的值存到Model
区域导航
区域Region 在xaml里挖一块区域
导航Navigation找到区域的坑,把另一个界面填进去
App里登记新View的名字
VM依赖注入,发起导航
导航传参
发送方用区域,导航,键对值传参
接收方继承INavigationAware接口-感知导航
导航日志
前进GoForward和后退GoBack
两个命令及按钮绑定
每个界面的js代码里加自动复制,dll文件自动推送到主项目文件
需要重新生成再运行,否则不更新dll
事件聚合器
跨模块跨VM通信
作用:解耦,不互相引用就能通信
新建类继承事件聚合器PubSubEvent<>
使用时引用using Prism.Events
引用using 继承聚合器的类.Events;
尖括号里是数据类型
拿到事件聚合器调用GetEvent
VM构造函数依赖注入事件聚合器IEventAggregator ea
发送方Publish
订阅方Subscribe
IOC注入
一般采用构造函数注入
Container容器
Prism 用 DryIoc 容器,负责创建对象、管理依赖、注入参数
Register注册
启动时告诉容器什么接口对应什么实现
Resolve解析
创建对象时,容器按注册找到实现类,连依赖一起创建好传进去
注册方式
RegisterSingleton — 单例
全局只有一个实例,所有注入拿到同一个,例如事件聚合器
RegisterTransient — 瞬时
每次注入都 new 一个新的,例如ViewModel
作成者