Silverlight依赖属性(二)
时间:2010-09-08 来源:JerryT
Silverlight依赖属性主要依靠叫做属性提供者的多种不同服务。为了决定一个属性当前的值,Silverlight不得不考虑它们的优先级问题。这种做法叫做动态值决议。
当判断一个属性的值的时候,Silverlight考虑一下的因素,从高等级往低等级依次排列:
1. 动画: 如果一个动画正在进行,并且它正在改变属性的值,Silverlight将使用它的值。
2. 本地值:如果你在你的代码或是XAML中明确的设定了一个值,Silverlight将用这个本地值。你可以通过SetValue()方法或是属性包装器来设置属性的值。如果你通过资源或是数据绑定来设置,它被看做是本地值。
3. 样式: Silverlight样式允许你通过一个原则来设置多个控件。如果你在一个控件上应用了样式,这个样式将产生效果。
4. 属性值继承:Silverlight可以在一小部分属性上利用属性值继承,主要包括Foreground,FontFamily,FontStrech,FontStyle和FontWeight.它意味着如果你在更高一级的容器(像Button或者ContentControl)中设置了这些属性,它同样应用在它内部的元素中(像它内部显示文字的TextBlock)。
注意:属性值继承有局限性,它要求容器必须提供你想要的属性。例如:你想通过设定根元素Grid的FontFamily属性来统一设定整个页面的字体。这样做是行不通的,因为Grid没有继承于Control,所以它不支持FontFamily属性。一个解决办法就是将你所有的元素包裹在一个包含了所有能用属性值继承的属性,并且没有内置的视觉外观的ContentControl中。
5. 默认值:如果没有其它的属性提供者赋值,依赖属性将会用它自己的默认值。默认值在属性第一次创建的时候和PropertyMedata一起被设定。上一篇有解释。
这种做法的一个好处就是非常"经济"。例如:当一个属性的值没有在本地设置的时候,Silverlight将会从样式或是模板中的中获取。这样就不需要额外的空间来储存它的本地值。另一个好处就是不同的属性提供者会重写其他提供者的值,但是他它们并不覆盖彼此。比如:如果你设置了一个本地值并且触发了一个动画,动画将暂时的起作用。你的本地值仍然保留,当动画结束后,它的效果将会继续。