.NET|--WPF|--笔记合集|--依赖项属性|--概览
前言
本文介绍一下WPF的依赖项属性, 可以让大家对该依赖项属性知识点有个简单认识.
"依赖项属性"其实也是"属性"的一种,
而"只读依赖项属性"又是"依赖项属性"的一种.
层级关系 : 属性 > 依赖项属性 > 附加属性 / 只读依赖项属性
[类 / 属性 / 方法 / 字段...]这些名词都是刚学编程那会学习的"基础"内容,
WPF很大胆, 直接把"属性"这么"基础"的内容扩展一下, 很多WPF类中不用属性,
而用"依赖项属性", 比如Brush(画刷), Margin,等...
经过这么一折腾,
在WPF上使用了"依赖项属性", 好家伙, 带来诸多好处.
( WPF设计开发人员 : "都是被逼的 ~" )
依赖项属性使用效率更高的保存机制, 并支持附加功能,
如更改通知(change notification), 以及属性值继承...
但是!!!
幸运的是, 尽管改变了这些基础, 但在代码中仍可以使用与读取和设置传统的.NET属性相同的方式来读取和设置依赖项属性.
这就厉害了, 加量不加价啊, 实现这么多功能,
但是咱们使用的时候还是和以前那么使用属性方式一样!
// 仍可以使用与读取和设置传统的.NET属性相同的方式来读取和设置依赖项属性, 其实使用的还是属性的"get"和"set"实现, 不过在"get"的时候使用"GetValue","set"的时候使用"SetValue"又包装了一层...
public static readonly DependencyProperty IsSpinningProperty = DependencyProperty.Register
(
"IsSpinning",
typeof(bool),
typeof(MainWindow)
);
// 读取和设置依赖项属性
public bool IsSpinning
{
get => (bool)GetValue(IsSpinningProperty);
set => SetValue(IsSpinningProperty, value);
}
// 读取和设置传统.NET属性
private bool _IsSpinning;
public bool IsSpinningTradition
{
get=> _IsSpinning;
//set { _IsSpinning = value };
set => _isSpinning = value;
}
关键词 / 术语
# WPF属性系统
Windows Presentation Foundation (WPF) 提供一组服务,这些服务可用于扩展类型的属性的功能。 这些服务统称为 WPF 属性系统。
# 依赖项属性(也叫:依赖属性, 我还是习惯称为"依赖项属性")
由DependencyProperty提供支持的属性
# CLR属性(也叫"标准.NET属性"/".NET标准属性"/"属性"/".NET属性")
属性是 "C#" 中的一等公民。 借助该语言所定义的语法,开发人员能够编写出准确表达其设计意图的代码。
访问属性时,其行为类似于字段。 但与字段不同的是,属性通过访问器实现;访问器用于定义访问属性或为属性赋值时执行的语句。
其实"C#"概念中只有"属性","方法","索引器",不过WPF搞出来的"依赖项属性",
所以为了区分"依赖项属性"和"属性", 特意在"属性"前加了CLR属性.
还是那句话,属性是 "C#" 中的一等公民...
这里叫"CLR属性"是为了卖给WPF面子, 毕竟现在正在讲WPF,
避免"属性"和"依赖项属性"搞的混淆,
想象一下大家给给变量命名的时候, 刚开始只有一个"Name", 后来突然又区分了"First Name"和"Last Name"...
# CLR属性过程(property procedure)
# 依赖项属性标识符
一个DependencyProperty实例,
在注册依赖项属性时以返回值的形式获取它,
之后将其存储为类的静态成员.
许多与WPF属性系统交互的API使用依赖项属性标识符作为参数.
# CLR"包装器"
属性的"get"和"set"实现.
这些实现通过在"GetValue"和"SetValue"调用中使用依赖项属性标识符来并入依赖项属性标识符.
这样,WPF属性系统就可以为属性提供支持.
依赖项属性理解
依赖项属性是CLR属性的全新实现
# 摘抄书中读的拗口的一段话↓
"如果WPF设计者只是在.NET属性系统上添加额外功能,
就需要为编写代码创建一个复杂庞大的层次,
如果不承受这一额外的负担, 普通属性就不能支持这些依赖项属性的所有功能."
# 借助AI的理解上面的那段话↓
如果仅在普通的.NET属性上添加功能来实现WPF所需的所有特性,
会导致代码变得非常复杂和庞大。
这是因为需要手动处理属性变更通知、数据绑定、动画和样式等功能。
每个功能都需要额外的代码和逻辑来支持,从而导致代码变得难以维护和理解。
依赖属性天然支持WPF的各种高级功能。
它们通过继承自DependencyObject类和使用DependencyProperty类来实现。
这些机制在底层实现了各种优化和功能支持,
也就是理念"不改变CLR属性基础上写额外代码",
改变为"重新实现CLR属性, 直接在底层修改逻辑来支持".
比如说在"CLR属性"的get和set中的"GetValu / SetValue".
依赖项属性定义
依赖项属性必知必会知识点
必知必会知识点, 我的理解就是这些知识点, 还是得知道的,
WPF开发过程中, 很大概率会用到, 相对基础的知识.
依赖项属性的注册
- 如何定义依赖项属性:展示如何在类中注册依赖项属性。
- 使用
DependencyProperty.Register
方法:解释每个参数的意义(属性名称、属性类型、所有者类型、属性元数据)。
附加属性(Attached Properties)
- 什么是附加属性:解释其定义和使用场景。
- 如何定义和使用附加属性:展示代码示例。
依赖项属性优先级
- 它允许属性的值根据一系列规则进行计算和优先级处理。
共享的依赖属性(Shared Dependency Properties)
- 共享的依赖属性是指在多个类之间共享的依赖属性。它们通常在一个基类中定义,然后在派生类中重复使用。这种机制允许属性值在多个类之间保持一致性。共享依赖属性的主要优势在于它们减少了代码重复,提高了代码的可维护性。
依赖项属性的使用
- 设置和获取依赖项属性的值:使用
GetValue
和SetValue
方法。 - 使用普通属性语法访问依赖项属性:展示如何像访问普通 CLR 属性一样访问依赖项属性。
依赖项属性的常见示例
- 自定义控件中的依赖项属性:创建一个自定义控件并添加依赖项属性。
- 常见 WPF 控件中的依赖项属性:如 Button、TextBox 等的依赖项属性示例。
依赖项属性进阶知识点
进阶知识点, 就属于不会这些知识点, 也可以开发, 没有问题,
但是嘛, 大家都在写Bug, 出点事故啥的, 不懂这些进阶知识点,
会很难办事啊.
属性改变回调(Property Changed Callbacks)和验证回调(Validation Callbacks)
- 使开发者能够在属性值发生变化时执行特定的逻辑或对属性值进行验证。这些机制包括属性改变回调(Property Changed Callbacks)和验证回调(Validation Callbacks)。
依赖项属性的属性元数据
- 属性元数据(PropertyMetadata):解释其作用及如何设置默认值、回调方法(如 PropertyChangedCallback、CoerceValueCallback)。
- 如何创建和使用属性元数据:展示代码示例。
调试和最佳实践
- 如何调试依赖项属性的问题:提供一些调试技巧和常见问题的解决方案。
- 依赖项属性的最佳实践:提供一些开发过程中需要注意的事项和建议。
依赖项属性用途
依赖属性的用途在于提供一种方法来基于其他输入的值计算属性值,例如:
- 系统属性,例如主题和用户首选项。
- 即时属性确定机制,例如数据绑定和动画/情节提要。
- 多用途模板,例如资源和样式。
- 通过与元素树中其他元素的父子关系知道的值。
此外,依赖属性还可以提供:
- 独立验证。
- 默认值。
- 回调,用于监视对其他属性的更改。
- 可以根据运行时信息强制转换属性值的系统。
用途详解
# 系统属性,例如主题和用户首选项。
例如,应用程序的主题(Theme)属性可以是一个依赖属性。
当系统主题改变时,所有依赖于主题属性的控件都会自动更新,以反映新的主题。
用户首选项(如字体大小、颜色等)通常会影响多个控件的外观和行为。
这些首选项可以被定义为依赖属性,当用户更改首选项时,所有依赖于这些属性的控件会自动调整。
# 数据绑定和动画
依赖属性支持数据绑定和动画,可以动态更新属性值。
例如, 绑定一个文本框的内容到某个数据源的属性,当数据源变化时,文本框内容自动更新。
例如, 对按钮的宽度应用动画,使其在鼠标悬停时逐渐变宽。
# 资源和样式
依赖属性可以在样式和模板中使用,使得控件可以通过样式和模板统一管理其外观和行为。
例如, 在应用程序资源中定义一个按钮样式,并在多个按钮中使用。
# 通过与元素树中其他元素的父子关系知道的值。
依赖属性可以根据元素在元素树中的位置和父子关系来继承值。
例如, 一个子控件继承父控件的字体大小。
我的理解就是定义了一个依赖项属性"Style"和依赖项属性"Binding"...
由依赖项属性提供的属性功能
第一次读这段话, 会感觉很绕口, 由依赖项属性提供的属性功能...
资源
数据绑定
样式
动画
元数据重写
属性值继承
WPF 设计器集成
依赖项属性 Vs 附加属性
附加属性是一种依赖项属性, 由WPF属性系统管理.
不同之处在于附加属性被应用到的类并非定义附加属性的那个类.
感觉这个也可以单独写一写了, 虽然三言两语可以说完特征,
但是想要自己深入理解, 还是写的更详细些比较好, 比如再加上例子...
结尾
WPF网上的资源感觉还是相对少, 难道是官网文档整理的太好了?
本来概览只想简单写几句而已, 最后东拼西凑, 感觉也有点乱乱的~
实非我本意, 哈哈, , ,
# 最后说一下, 为什么WPF从"依赖项属性"开始记笔记,
最近在看<<WPF编程宝典(第4版)>>, 当我看到第10章了,
再次看到"依赖项属性"的时, 竟然感觉说不上来一二三,
而我是从第8章节开始做笔记的, 前几章节都是一扫而过,
所以再次学习一下"依赖项属性"知识点, 并且记录一下笔记.
还是那句话"纸上得来终觉浅,绝知此事要躬行."
学习小技巧
使用LINQPad ~~~
参考资料
- 巨硬.依赖属性概述 (WPF .NET)
- <<WPF编程宝典(第4版)>>
- AI GPT