WPF学习系列022: 3.2.4 对多个提供程序的支持

来源:互联网 发布:手游美工 编辑:程序博客网 时间:2024/06/13 22:29

 

  •  
    1. 由于多个提供程序可以控制同一个依赖属性,因此需要良好的机制来处理这些完全不同的属性值提供程序。通过5步流程,WPF运行每个依赖属性并最终计算出它的值。
    1. 本地值
    2. 样式触发器
    3. 模板触发器
    4. 样式设置程序
    5. 主题样式触发器
    6. 主题样式设置程序
    7. 属性值继承
    8. 默认值
    1. 可以通过静态方法DependencyPropertyHelper.GetValueSource判断依赖属性从哪里获得当前的值。该方法返回一个ValueSource结构,其中包括以下数据:
      1. BaseValueSource枚举值,反映基础值从哪儿来
      2. IsExpression,是否是计算值
      3. IsAnimated,是否是动画值
      4. IsCoerced,是否是限制值
    1. 清除本地值
  • 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);

     

原创粉丝点击