参考资料:

一站式WPF--依赖属性(DependencyProperty)一

一站式WPF--依赖属性(DependencyProperty)二

        依赖属性之我见

这两篇文章介绍的了依赖属性的本质和由来,挺清晰的。

自我理解:依赖属性,说明有两个关系,依赖和属性。

依赖的由来:

在面向对象的世界里,属性大量存在,比如Button,就大约定义了70-80个属性来描述其状态。那么属性的不足又在哪里呢?

  当然,所谓的不足,要针对具体环境来说。拿Button来讲,它的继承树是Button->ButtonBase->ContentControl->Control->FrameworkElement->UIElement->Visual->DependencyObject->…

  每次继承,父类的私有字段都被继承下来。当然,这个继承是有意思的,不过以Button来说,大多数属性并没有被修改,仍然保持着父类定义时的默认值。通常情况,在整个Button对象的生命周期里,也只有少部分属性被修改,大多数属性一直保持着初始值。每个字段,都需要占用4K等不等的内存,这里,就出现了期望可以优化的地方:

  • 因继承而带来的对象膨胀。每次继承,父类的字段都被继承,这样,继承树的低端对象不可避免的膨胀。
  • 大多数字段并没有被修改,一直保持着构造时的默认值,可否把这些字段从对象中剥离开来,减少对象的体积

有了以上的背景,依赖就出现了,微软设计了DependencyProperty类, 里面有着 public static DependencyProperty Register(string name, Type propertyType, Type ownerType, object defaultValue)方法来注册属性。然后又定义了一个DependencyObject的基类来消费这个属性。这样继承自DenpendencyObject的类就可以注册自己的依赖属性,属性是自己注册的,其实严格的说并不是自己的,所以节省了空间。注册的属性在DependencyProperty里面通过一个hash( internal static Dictionary<object, DependencyProperty> RegisteredDps = new Dictionary<object, DependencyProperty>())来维护。注册过的属性都存在这个hash里面。自此依赖我感觉的由来就清楚了,不是自己的属性,而是此属性要依赖于DependencyProperty的。

依赖解释好了,那属性呢?其实属性就是对外暴漏接口罢了,注册依赖属性后就是给依赖属性赋值(set),或者问依赖属性取值(get),这些操作封装到了DependencyObject类里面,所有用过的属性的值都通过 List<EffectiveValueEntry> _effectiveValues = new List<EffectiveValueEntry>()来存储和维护。这样就不会污染最初的默认value。这里也就实现了某个属性变化的过程都可以DependencyObject里面的effectiveValues找到痕迹,这样也就支持了动画。获取和赋值都是通过EffectiveValueEntry这个入口来获得的。就此依赖属性设计好了。

这样的设计听好了,但是我们想要求子类也有自己的默认属性,比如很多控件都有Name属性,但有时候并不希望大家的默认值是一样的,但是有共用同一个DP。这该怎么解决呢?

要想支持不同的默认值,那么内部就要维护一个对应不同DependencyObjectType的一个List,可以根据传入的DependencyObject的类型来读取它对应的默认值。DP内需要维护一个自描述的List,按照微软的命名规则,添加新的类型属性元数据(PropertyMetadata)。其实在DependencyProperty里面添加了private List<PropertyMetadata> _metadataMap = new List<PropertyMetadata>();来维护元数据,实现对默认值的修改。

附加属性之我见:说白了就是依赖属性的改造,只是封装不同,区别在于附加二字,其实就是有些对象不具备某些属性,有些对象具备这些属性,那么具备这些依赖属性的对象就可以某些属性附加到不具备这些属性的对象上。比如人没有年级,班级的属性,而学校有年级班级的属性,但是当人在学校学习的时候就具备了班级年级的属性,这个时候学校这个对象就可以附加给人这个对象班级年级的属性。这就是附加属性。

回想下依赖属性,依赖属性是对一个对象来说的,这个对象可以注册依赖属性,以后这个对象就具备了这个属性。而附加属性是对两个对象来说的,一个是附加对象,一个是被附加对象。是不是可以这样理解,附加对象给被附加对象注册了一个依赖属性罢了。但这个依赖属性依靠附加对象操作。自己的理解不知道正确与否。

往更深层次的,就看看开头两篇的博客吧。

转载于:https://www.cnblogs.com/fuchongjundream/p/3892949.html

WPF之依赖属性和附加属性相关推荐

  1. WPF的依赖属性和附加属性(用法解释较全)

    转:https://www.cnblogs.com/zhili/p/WPFDependencyProperty.html 一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己 ...

  2. wpf 依赖属性和附加属性

    原文:wpf 依赖属性和附加属性 1.依赖属性 解释:依赖属性是配合binding出现的产物,功能主要是配合binding. 作用: 一.当自定义usercontrol时,需要与宿主(父窗体)双向绑定 ...

  3. Wpf依赖属性和附加属性在样式中的应用

    文章目录 前言 一.依赖属性的使用方法 1.添加派生类(以Button为例) 2.修改样式模板 3.前台应用 二.依赖属性的使用方法 1.添加普通类 2.修改模板 3.前台使用 总结 前言 在wpf的 ...

  4. WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性

    原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? ...

  5. WPF 中依赖属性的继承(Inherits)

    WPF中依赖属性的值是是可以设置为可继承(Inherits)的,这种模式下,父节点的依赖属性会将其值传递给子节点.例如,数据绑定中经常使用的DataContextProperty: var host ...

  6. WPF快速入门系列(2)——深入解析依赖属性

    一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最 ...

  7. WPF整理-为User Control添加依赖属性

    WPF整理-为User Control添加依赖属性 原文:WPF整理-为User Control添加依赖属性 依赖属性 ".NET properties are nothing more t ...

  8. SilverlightWPF依赖属性DependencyProperty讲解

    作者:周永恒  出处:http://www.cnblogs.com/Zhouyongh   本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  9. [UWP]依赖属性2:使用依赖属性

    原文:[UWP]依赖属性2:使用依赖属性 5. 完整的自定义依赖属性 5.1 定义 /// <summary> /// 标识 Title 依赖属性. /// </summary> ...

最新文章

  1. Java学习总结:21
  2. 【机器学习】如何通俗易懂地阐述机器学习?
  3. oracle group by用法_从OceanBase TPCC测试报告看ORACLE兼容性进展
  4. iptables二之防火墙SNAT源地址转换,MASQUERADE地址伪装之DNAT目标地址转换讲解和实验演示...
  5. 在Spring中嵌入HSQLDB服务器实例
  6. 单位几个小伙子,又因为微服务的事吵的不可开交
  7. android程序设计activity,《Android编程权威指南》之第二个activity
  8. CTS(23)---Camera Media CTS GTS VTS 记录
  9. 【Xamarin开发 Android 系列 1】环境部署搭建
  10. 倒车雷达c语言编程,汽车倒车雷达系统的设计与实现(论文c1)
  11. 【python】CNN算法
  12. PDF如何复制页面,PDF复制页面这种方法就够了
  13. GD32 MCU USB开发学习记录
  14. Intel i5-7200U (3100MHZ),1*8GB(DDR4 2666) 在 Aida64 V5.97.4600 的测试结果
  15. 微信公众服务号申请流程
  16. 高精度练习之超大整数开根
  17. 英语口语网站免费学习资源大全
  18. 阿木动态 | 助力机器人教育!一站式智能无人机专业课程建设方案!
  19. oracle = 中文生效,prm dul恢复oracle数据库数据表 中文最简易说明
  20. 山东理工大学计算机专业是一本吗,不负韶华,青春依旧|山东理工大学计算机学院计本94级毕业20周年聚会...

热门文章

  1. VS与Matlab混合编译 - mexw64 (C++版)
  2. 【pygame】pygame的init()
  3. ERROR 1136 (21S01): MySQL 的报错: 错误 1136(21S01): 列的计数 与 value 的计数 不相符 在第四行。
  4. centos6mysql编译安装_centos6编译安装MySQL
  5. 查看Oracle数据库表空间大小(空闲、已使用),是否要增加表空间的数据文件
  6. spring的view
  7. spring配置JDBC事务
  8. 四、CI框架之通过URL路径访问C中的函数
  9. 5-4 是否同一棵二叉搜索树 (25分)
  10. 光学基础 光学积分器-通光管及透镜阵列