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

简介:

前一个Post中,曾提到将要重点研究Dependency属性的三个方面:变化通知;属性值的继承;支持多个提供对象。下面,我将分别就这三个内容进行简单地说明。

【变化通知】

在任何时候,只要Dependency属性的值发生了变化,WPF可以自动地根据属性的元数据触发不同的行为。前面提到过:Dependency属性最大的特点就是内建的变化通知功能。这种内建变化通知所提供的最值得注意的就是属性触发器(Property Trigger),就是它使用我们不需要编写任何的程序代码就能在属性变化使执行自定义行为。请看下面XAML编码的一个属性触发器例子:

<Trigger Property=”IsMouseOver” Value=”True”>

     <Setter Property=”Foreground” Value=”Blue”/>

</Trigger>

它的功能就是在属性值IsMouseOver变为True的时,将属性Foreground的值设置为Blue。而且,它会在IsMouseOver变为False时自动将Foreground的值设置为原来的值。就是这样简单的三行代码完成了我们曾经需要多个函数、变量才能实现的功能。

使用属性触发器时需要注意:触发器默认适用于每个类对象。 而且,在WPF 3.0中由于人为的限制,Property Trigger将不能应用在单独的元素。只能应用在某个Style对象之中。因此,如果想在某个单独对象上实现Property Trigger。必须用如下的XAML进行封装:

<Button MinWidth=”75” Margin=”10”>

<Button.Style>

     <Style TargetType=”{x:Type Button}”>

     <Style.Triggers>

           <Trigger Property=”IsMouseOver” Value=”True”>

                <Setter Property=”Foreground” Value=”Blue”/>

           </Trigger>

     </Style.Triggers>

     </Style>

</Button.Style>

     OK

</Button>

【属性值继承】

属性值继承是指在设置逻辑树某个结点元素的属性后,它的所有之结点都继承这个属性值(当然,前提是子元素必须支持这个属性)。我们仍然利用闲话WPF之八中的一个例子进行说明:

<Window FontSize=”30”>

     <StackPanel>

           <Label>LabelText</Lable>

     </StackPanel>

</Window>

我们修改了WindowFontSize属性为30。通过实际观察将发现它的子元素LabelFontSize也变为了30。注意这里的StackPanel是一个容器元素,它本身并不支持FontSize属性。

现在我们给上面的Window添加一个状态栏。XAML代码如下:

<Window ......>

     <StackPanel>

           <Label>LabelText</Lable>

           <StatusBar>This is a Statusbar</StatusBar>

     </StackPanel>

</Window>

这时你会发现:虽然StatusBar支持这个FontSize这个属性,它也是Window的子元素,但是它的字体大小却没有变化。为什么呢?因为并不是所有的元素都支持属性值继承。还存在如下两种例外的情况:

1、部分Dependency属性在用Register注册时可以指定Inherits为不可继承。

2、如果有其他更高优先级方法设置了其他的值。(关于优先级的介绍且看下面分解。)

部分控件如StatusBarMenuTooptip内部设置它们的字体属性值以匹配当前系统的设置。这样用户通过控制面板可以修改它们的外观。这种方法存在一个问题:StatusBar等截获了从父元素继承来的属性,并且不影响其子元素。比如,如果我们在StatusBar中添加了一个Button。这个Button的字体属性会因为StatusBar的截断没没有改变,将保留其默认值。

附加说明:属性值继承的最初设计只适用于元素Tree,现在已经进行多个方面的扩展。比如,值可以传递下级看起来像Children,但在逻辑或者视觉Tree中并不是Children的某些元素。这些伪装的子元素可以是触发器、属性的值,只要它是从Freezable继承的对象。对于这些内容没有很好的文档说明。我们只需要能使用就行不必过多关心。



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

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