闲话WPF之十一(Dependency属性 [3] )

简介:
前一个Post 中,重点说明了Dependency属性的变化通知和属性值的继承两个方面,下面我们再看看Dependency属性所支持的多个提供对象。

【支持多个提供对象】

WPT提供了独立的、强大的机制来设置Dependency属性的值。由于支持多个提供对象,如果没有很好的机制来处理这些提供对象,那么Dependency属性的值将是不可预测的、系统也将变得混乱。Dependency属性的值取决于这些提供对象,它们以一定的顺序和优先级排列。

下图说明了WPF在计算Dependency属性最终值的5个步骤:



 

基本的计算过程是:

确定基础值====>计算值(如果是表达式)===>应用动画====>强制值===>值验证

1、确定基础值

多数的提供对象都会影响基础值,下面以优先级顺序列出了可以设置多数Dependency属性值的八个提供对象:

1、Local Value                  2、Style Triggers              3、Template Triggers                   4、Style Setters 
5、Theme Style Triggers    6、Theme Style Setters     7、Property Value Inheritance      8、Default Value

Local Value技术上表示任何对DependencyObject.SetValue的调用。它的最常见形式就是在XAML或者代码中的属性赋值。因为我们通常用.NET的属性方式封装了对GetValue/SetValue的调用。Regitser注册时指定的默认值位于处理过程的最后一步。关于其它的提供对象,如Style、Template将在以后介绍,敬请关注后续内容。

2、计算值

如果第一步得到的是一个表达式,WPF将计算表达式以得到一个具体的值。在3.0版本的WPF中,只有动态资源或者是数据绑定才可能有表达式。也许将来版本的WPF会支持其它类型的表达式。

3、应用动画

如果当前有一个或者多个动画在运行,它们具有修改当前属性值、或者完全替代它的能力。因此,动画的级别比其它属性提供对象都高,甚至是Local Value,我们必须记住这一点。

4、强制值

在处理完所有的提供对象后,WPF将最终的属性值传递到CoerceValueCallback委派。如果Dependency属性在注册时提供了这样的委派,那么就应该根据自定义逻辑返回一个新的值。比如ProgressBar,当所有提供对象最后所提供的值超出了其定义的最大、最小值范围时,ProgressBar将利用这个CoerceValueCallback委派限制在这个范围之内。

5、值验证

最后,前缀的强制值将传递给ValidateValueCallback委派,如果Dependency属性注册了这个委派。当值有效时委派必须返回True,否则返回False。返回False将抛出异常,终止整个进程。

附加说明:如果我们不知道给定的Dependency属性的值来源于何处,可以调用静态的DependencyPropertyHelper.GetValueSource方法。它作为调试时的辅助工具,有时能给我们提供帮助。方法会返回一个ValueSource结构。ValueSource结构中的属性成员BaseValueSource、IsExpression、IsAnimated、IsCoerced分别表示了前面列出的八个提供对象的相应类型。注意:请不要在最后的发布产品中使用这个方法,因为在将来版本的WPF中可能有不同的行为。只应该将其作为调试工具。



本文转自赖仪灵博客园博客,原文链接:http://www.cnblogs.com/YilingLai/archive/2006/12/25/602889.html,如需转载请自行联系原作者。

目录
相关文章
|
6月前
|
C#
2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>
2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>
20 0
|
6月前
|
存储 开发框架 .NET
2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>
2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>
21 0
|
9月前
|
C#
WPF属性---重复样式和触发器
WPF属性---重复样式和触发器
70 0
WPF项目中不支持 ResizingPanel,未在类型“ResizingPanel”中找到可附加的属性“ResizeWidth”
WPF项目中不支持 ResizingPanel,未在类型“ResizingPanel”中找到可附加的属性“ResizeWidth”
|
C#
WPF整理-为User Control添加依赖属性
原文:WPF整理-为User Control添加依赖属性 依赖属性 ".NET properties are nothing more than syntactic sugar over set and get methods." 我们知道.NET的属性只不过是get/set方法的语法糖衣。
827 0
|
C# 容器 .NET
WPF属性(二)附加属性
原文:WPF属性(二)附加属性 附加属性是说一个属性本来不属于某个对象,但由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性就称为附加属性,附加属性的作用就是将属性与数据类型解耦,让数据类型的...
796 0
|
C# .NET 开发框架
WPF属性(一)依赖属性
原文:WPF属性(一)依赖属性 依赖属性是一种可以自己没有值,并能通过使用Binding从数据源获得值的属性,拥有依赖属性的对象称为依赖对象,在传统开发中,一个对象所占用的内存在调用new操作符进行实例化的时候就已经决定了,而WPF允许对象在被创建的时候并不包含用于存储数据的空间,只保留在需要用到数据时能够获得默认值、借用其他对象数据或实时分配空间的能力,这种对象就是依赖对象,而这种实时获取数据的能力就是靠依赖属性来实现。
768 0
|
C# C++
WPF附加属性的Set函数不调用的问题
原文:WPF附加属性的Set函数不调用的问题 今天写程序的时候用到了附加属性,我是用VS内置的propa的代码段来实现的,代码如下:     class Attach    {        public static bool GetIsEnabl...
828 0
|
C# 测试技术
WPF 中依赖属性的继承(Inherits)
原文:WPF 中依赖属性的继承(Inherits) WPF中依赖属性的值是是可以设置为可继承(Inherits)的,这种模式下,父节点的依赖属性会将其值传递给子节点。例如,数据绑定中经常使用的DataContextProperty:     var host = new ContentContro...
835 0