-
- 由于多个提供程序可以控制同一个依赖属性,因此需要良好的机制来处理这些完全不同的属性值提供程序。通过5步流程,WPF运行每个依赖属性并最终计算出它的值。
- 本地值
- 样式触发器
- 模板触发器
- 样式设置程序
- 主题样式触发器
- 主题样式设置程序
- 属性值继承
- 默认值
- 可以通过静态方法DependencyPropertyHelper.GetValueSource判断依赖属性从哪里获得当前的值。该方法返回一个ValueSource结构,其中包括以下数据:
- BaseValueSource枚举值,反映基础值从哪儿来
- IsExpression,是否是计算值
- IsAnimated,是否是动画值
- IsCoerced,是否是限制值
- 清除本地值
3.2.4 对多个提供程序的支持
第1步 判断基础值
8种基础值提供程序,其优先级从高到低顺序为:
第2步 计算
如果第一步的值是表达式,WPF需要将表达式转换为具体的结果。
第3步 应用动画
如果一个或多个动画在运行,它们有能力改变当前的属性值,或者完全替代当前的属性值。因此动画胜过任何其它属性值提供程序。
第4步 限制
经过上述3步,WPF将得到一个属性值,如果依赖属性注册了CoerceValueCallback,将会把这个属性值传递给CoerceValueCallback委托。该回调函数负责返回一个新的属性值,它是基于自定义逻辑实现的。
第5步 验证
如果依赖属性注册了ValidateValueCallback,之前的限制中的值将传入ValidateValueCallback委托。如果输入值有效,该回调函数返回true;否则返回false。返回false将抛出一个异常,并取消整个流程。
在程序代码中最好不要使用这个方法。
通过调用 DependencyObject.ClearValue 方法可以清除本地值,让WPF从下一个最高优先级的提供程序中获得值,然后使用这个值来设置最终的属性值。
例如:
Button b = new Button();
b.ClearValue(Button.ForegroundProperty);