.NET|--WPF|--笔记合集|--依赖项属性|--概览

news/2024/7/6 17:20:40/文章来源:https://www.cnblogs.com/love-zf/p/18275832

前言

本文介绍一下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)

  • 共享的依赖属性是指在多个类之间共享的依赖属性。它们通常在一个基类中定义,然后在派生类中重复使用。这种机制允许属性值在多个类之间保持一致性。共享依赖属性的主要优势在于它们减少了代码重复,提高了代码的可维护性。

依赖项属性的使用

  • 设置和获取依赖项属性的值:使用 GetValueSetValue 方法。
  • 使用普通属性语法访问依赖项属性:展示如何像访问普通 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/733763.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年自学python必看的书籍《Python编程:从入门到实践 第三版》PDF免费下载

本书是一本针对所有层次的Python 读者而作的Python 入门书。第一部分介绍了编程环境的搭建和Python编程所必须了解的基本概念。第二部分将理论付诸实践,讲解如何开发三个项目:分别是射击游戏、数据可视化、小型Web应用程序适读人群 :本书适合对Python感兴趣的所有读者阅读。…

视频监控智能分析系统

视频监控智能分析系统核心技术优势是以各大监控终端为基础,以智能视频分析系统为核心,用户可以在后台设置视频监控智能分析系统的某些特定的规则,视频监控智能分析系统识别不同区域范围内的物体,同时识别范围内的目标行为是否符合这些规则。如果发现监控画面中的异常情况,…

模拟集成电路设计系列博客——8.2.3 振荡器的相位噪声

8.2.3 振荡器的相位噪声 振荡器的相位噪声是一个基本特征。因为不存在一个无损失的振荡器(那就是永动机了),任何振荡器都需要一些有源电路来维持振荡,而这些有源电路会引入噪声。具体哪个器件引入了噪声的机理很微妙,到了后来才逐渐变得易于理解。但是,相位噪声的现象学事…

微信小程序中使用阿里图标iconfont

由于微信小程序中图标不是很全或者用png等图片每次都要修改图片颜色或者啥的感觉不是很方便 用习惯了阿里单色图标库之后,感觉总是缺点什么,所以总结了一下,废话不多说,步骤如下:1. 阿里图标库地址:https://www.iconfont.cn 自己进去选择图标,然后选择fontclass下载到本…

Xming配合Winterm实现远端Linux本地图形显示

1.下载安装xming xming可以实现在windows上访问linux的图形应用程序。 xming下载sourceforge 安装基本都是下一步,这里使用windterm作为ssh客户端,因此不再需要额外安装,其他选项根据需要自定义。2.配置xming 同xming一起安装的有一个xlaunch的软件,打开后其他都默认,这一…

mysql索引数据结构

一、索引 1. 什么是索引 索引是帮助MySql高效获取数据的排好序的数据结构。 2.索引的数据结构 ① 二叉树(Binary tree) 定义:是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树。 特点:左子树小于父节点的值,右子树大于父节点的值。 缺点:当…

字典树

字典树 它是一个快速插入和查询的多叉树 支持字符串的操作 支持查询和插入 使用边来标记我的字母 它的路径代表着这个字符串 比如1 2 6 11这条路径的意思就是字符串aba 如果要插入字符就在应该有的字符串路径插入应该要的字符 Code:#include <bits/stdc++.h>using names…

题目集7~8总结

5-6次大作业难度还算较简单,尤其第五次大作业,可谓是开场小菜,到第六次作业才上了一些难度,而第七次第八次更是难度大大增加,第二轮大作业比起第一轮大作业难度上升了不少,运用到的东西更新,更先进,所涉及的思维设计,逻辑框架也更难,还有其计算的设计也会很复杂很难。…

项目微服务化

记得不久之前,我曾经计划将本项目改造成微服务的形式,原因在于探索了Graal VM以后,我发觉曾经梦想的将自己的项目微服务化并不是一个天方夜谭,而是一些切实可行的,只需要工作量堆砌的事情。于是这段时间我就集中精力把这件事情做了一下。但是实际做完的感觉尽管非常舒心,…

内网穿透之frp+proxifier实现socks5反向代理

frp是一个专注于内网穿透的高性能的反向代理应用,proxifier允许用户将网络应用程序通过代理服务器进行连接。目录前言环境搭建frp反向代理proxifier代理工具 前言内网穿透,代理技术的联系与区别?我个人感觉在内网渗透的时候它们之间的界限很模糊,其目的都是为了突破内网访问…

笔记本电脑的电源计划

电池保留电池电量 保留电池电量使用电池:7%接通电源:7%"保留电池电量"通常是指设备为了延长电池整体寿命而采取的一种策略,比如在电池充电时不会充满至100%,而是维持在一个较低的安全水平(例如93%),以减少电池的高压力状态,这是一种电池维护功能。 关键级 关…

Web应用课 3.1 JavaScript——变量与运算符、输入输出、判断、循环

JS的调用方式与执行顺序 使用方式 HTML页面中的任意位置加上<script type="module"></script>标签即可。 常见使用方式有以下几种:直接在标签内写JS代码。 直接引入文件:<script type="module" src="/static/js/index.js">&…

综述 | 农业大模型:关键技术、应用分析与发展方向

分享一篇农业大模型综述。 官网全文免费阅读知网阅读农业大模型:AI领域的新热点 农业大模型,基于Transformer架构,通过自监督学习方法,在大规模数据上进行训练,展现出了卓越的通用能力和强大的下游任务适应性。这些模型不仅能够处理复杂的关联表示,还在多模态信息处理等方…

[算法学习笔记] 可持久化栈

可持久化栈前置知识 可持久化,即对于每次更改,我们都期望记录它的历史信息。容易进行可持久化的数据结构通常满足 修改数据结构是,数据结构本身的拓扑序没有改变。,即形态没有改变。例如线段树,Trie 树,数组都可以容易地进行可持久化。 可持久化线段树前面已经讲过,见 算…

Windows Terminal 自定义 SSH 连接

我们在远程操作Linux主机时常常会使用各种Remote SSH工具,比如最常用的X Shell、MobaXterm。这些工具功能强大,但很多时候只是需要开个终端,Windows 10开始自带的Windows Terminal就不错。 Windows Terminal 是Window 10 以上系统自带的工具,对选项卡、富文本等功能支持不错…

OOP第四次blog

本次blog是本学期的最后一次blog,接下来分析最后一次小结内容的PTA作业。 本次作业分为以下部分: (1)总结三次题目集的知识点、题量、难度等情况。 (2)设计与分析:重点对题目的提交源码进行分析。 (3)采坑心得:对源码的提交过程中出现的问题及心得进行总结。 (4)改…

南昌航空大学第二次blog

本次blog是本学期的最后一次blog,接下来分析最后一次小结内容的PTA作业。 本次作业分为以下部分: (1)总结三次题目集的知识点、题量、难度等情况。 (2)设计与分析:重点对题目的提交源码进行分析。 (3)采坑心得:对源码的提交过程中出现的问题及心得进行总结。 (4)改…

(交换使逆序对数为1+并查集)CF1768D Lucky Permutation

题意:思路: 先从排好序的数组考虑:1,2,3,4,5,...n,如果交换相邻元素,必然使得逆序对数+1。 考虑先将乱序数组变成顺序数组,最后交换任意一对相邻元素即可。 将所有的i与\(p_{i}\)连边,最后形成若干个环,交换次数其实就是边数,也即点数-环数。并查集维护。 注意特殊情…

[C++ Primer] 开始

C++ Primer 第5版中英版电子版pdf开始 C++ Primer 第5版pdf中英版 夸克云盘 百度云盘 提取码:qrjn该系列记录了我在学习C++过程中经常会遗忘和混淆的相关操作语法,以备将来用到时方便查找。 加油吧!!!🙆