今天在學習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