wp7学习总结:DependencyObject与DependencyProperty

大致读了一遍programming windows phone 7这本书,也看了eula哥共享的关于DependencyObject与DependencyProperty的帖子,另外还有几个网友在问类似的问题;所以我来做个简短的总结,希望对大家有帮助
如果你没有开发过wpf/silverlight,读programming windows phone 7你会觉得很困惑,可能作者并没有考虑都这部分读者。

请先阅读这两篇文章,再看下面的总结
http://www.codeguru.com/csharp/.net/net_general/netframeworkclasses/article.php/c13015
http://www.devdiv.com/thread-51606-1-1.html
http://www.devdiv.com/thread-51607-1-1.html
http://nirajrules.wordpress.com/2009/01/19/inside-dependencyobject-dependencyproperty/

为什么要引入?
因为属性随着继承层次越来越多,子类的属性会发生膨胀,同时多数时候,子类并不更改父类属性值,没有必要每个子类对象都保存一个这样属性值,
所以引入了依赖属性

依赖属性的功能?
DependencyProperty有一个静态Dictionary成员,它负责存储所有的属性值,同时提供了读写方法。
不需要改变的属性都在这张系统唯一的表中,不需要每个子类对象保存一份

DependencyProperty与DependencyObject关系?
DependencyObject实际上是通过DependencyProperty来设置、查找类属性,它本身不存储

子类通过什么方式改变父类的属性?
首先DependencyProperty提供了对子类定制父类属性的支持,它提供了PropertyMetadata,
子类可以定义一个DependencyProperty的实例,通过修改PropertyMetadata可以设置子类的属性值

如何改变对象属性?
任何一个DependencyObject对象保存有一个EffectiveValues,用来存储对象改变的属性,
也就是说改变了的属性是存储再DependencyObject的对象里面的,不改变的存储在DependencyProperty中。
DependencyProperty中PropertyMetadata是支持子类改变父类的属性(注意:这里说的是子类的属性,而不是子类的实例,而DependencyProperty的静态Dictionary是保存不变的属性的

EffectiveValues中都有哪些值?
EffectiveValues中存的是属性改变值,因为改变的情况很多,所以这个值不是唯一的,其中包括BaseValue, AnimatedValue, CoercedValue, ExpressionValue
其中后面的比BaseValue的优先级高

改变对象属性值的优先级?
除了前面说的优先级问题,还涉及到BaseValue的确认问题,
BaseValue设置中本地设置,就是在xaml中直接给属性赋值或者在构造函数中给属性赋值优先级最高,其他的比如style, template, trigger等都比它优先级别低

返回属性到底返回的是什么值?
我们想获取属性的值,有这么多地方保存着,到底返回哪个呢?
wpf首先查找EffectiveValues,如果找到就返回,否则查找PropertyMetadata,如果失败查找DependencyProperty的静态Dictionary.

EffectiveValues与LocalValue什么关系?
前面已经解释了什么是LocalValue,其实LocalValue就是BaseValue中优先级最高的Local本地值
posted @ 2012-06-25 10:00  therockthe  阅读(355)  评论(0编辑  收藏  举报