理解依赖属性

最近在学习Windows Phone 7的开发,目前WP7开发方式有两种,分别为Silverlight和XNA。其中Silverlight多用作开发应用,而XNA专门用于游戏开发。只是我对游戏开发总有一种高山仰止的感觉,只好主攻Silverlight了。

Silverlight其实是WPF的轻量级实现,其中一个非常核心的概念就是依赖属性,曾今多次阅读相关文章,但一段时间后又变得似懂非懂。

今天看到这篇文章http://www.cnblogs.com/zhouyongh/archive/2009/09/10/1564099.html,终于拨开乌云,见了明月。

总结下来,依赖属性从需求到实现的思路:

1. 大量对象(主要是控件)继承产生了大量属性,并且这些属性往往拥有相同的默认属性值,在很多情况下大部分属性值并不会被改变。按照旧有的方式,每个控件都单独维护自己的属性值,导致了大量的内存空间浪费。由此,产生了如何抽取这些继承属性的需求

2. 第一步:创建一个全局的依赖属性对象用来存储可以共用的属性(Key-Value)

    第二步:创建一个依赖对象,如果依赖对象需要实现一个依赖属性,则需要向全局的依赖属性对象注册特定的依赖属性(key使用Name的Hashcode^依赖对象类型的Hashcode),存取值的时候通过key到依赖属性设置或读取已注册的依赖属性的值。

由此,依赖对象本身所需的存储空间有了一定的减少。

3. 依赖对象的特定依赖属性被维护在依赖对象中,仍然会存在一个问题,那就是当某个依赖对象修改了该特定依赖属性后,全局的依赖属性中维护的依赖属性会被更改,而这个更改会影响所有使用改依赖属性的依赖对象。所以,需要提供一种机制使修改后的特定依赖属性只存储与依赖对象本身。

4. 在依赖对象中增加 有效值列表(effective values)来解决修改后的依赖属性值的读取问题(同时依赖属性也需要增加属性的唯一标记Index)

所有的修改后的依赖属性值存在有效值列表当中,需要的时候从中读取,否则读取全局依赖属性的默认属性值

(我在想控件属性的Reset Function是不是就是清空了effective values列表,然后就变成去读取默认属性了。。。)

5. 最后,同一个DP有些时候需要支持不同的默认值,由此引入类型属性元数据(PropertyMetaData)来解决这个问题,即为有继承关系的多个的Dependency Object指定不同DP属性默认值。通过一个PropertyMetaData的列表实现(PropertyMetaData包括ForType和DefaultValue两个字段)

 

嗯,基本就是这样了,确实清楚很多,明天继续看下附加属性 

 

posted @ 2011-12-07 23:52  月小  阅读(444)  评论(0编辑  收藏  举报