今天在学习WPF依赖属性的时候做了一个很经典的例子,即通过XMAL中的Trigger来改变按钮的前景色。具体代码如下:
Code
<Button>
OK
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="Blue"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
可以很好的实现,将鼠标移至按钮上,然后按钮的前景色变为蓝色的功能。
但是尝试给此按钮设置一个Foreground属性,代码:
Code
<Button Foreground="Black">
OK
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="Blue"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button
则使Trigger设置前者色的作用失效了。于是这便使我联想到这几天看到的一篇Dependency属性计算顺序的文章
(http://www.cnblogs.com/YilingLai/archive/2006/12/25/602889.html)
原来在第一步计算基础值的时,系统是按照下面的优先级来计算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
因为Foreground="Black"属于Local Value,比Style Triggers的优先级要高,所以在计算过程中
它掩盖了Style Triggers对Foreground属性值的作用。
那么既需要设置Foreground同时也需要通过设置Trigger来改变它怎么做呢?
答案就是如下面代码所示:
Code
<Window.Resources>
<Style TargetType="{x:Type Button}" x:Key="changeColorStyle">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="Blue"></Setter>
</Trigger>
</Style.Triggers>
<Setter Property="Foreground" Value="Black"></Setter>
</Style>
</Window.Resources>
<StackPanel>
<Button Style="{StaticResource changeColorStyle}">
OK
</Button>
</StackPanel
将Style提取到Window.Resources中,然后使此Button引用此资源。
因为在计算基础值的顺序时,Style Triggers排在第二,而Style Setter则排在第四的位置上。
Code