使用样式触发器更改标签的前景色

时间:2012-01-09 21:59:34

标签: c# wpf xaml triggers styles

我为Label创建了一个样式,它应该根据“IsEnabled”属性的值改变前景的颜色:

<Style x:Key="ToggleLabelStyle" TargetType="{x:Type Label}">
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Foreground" Value="{DynamicResource DisabledToggleTextBrush}"/>
        </Trigger>
    </Style.Triggers>
   (...)
</Style>

我的一个控件有一个应用了此样式的标签。标签的“IsEnabled”属性绑定到控件的View-Model中的属性:

查看XAML:

<Label x:Name="RememberCredentialsLabel" Style="{DynamicResource ToggleLabelStyle}" IsEnabled="{Binding SaveCredentials}" Content="Remember Credentials" Grid.Column="1" Margin="0,28.849,39.339,10.124" Grid.Row="3" HorizontalAlignment="Right" Width="130.5" Foreground="White"/>

查看 - 模型属性:

public bool SaveCredentials
{
    get
    {
        return _saveCredentials;
    }
    set
    {
        _saveCredentials = value;
        RaisePropertyChanged(() => SaveCredentials);
    }
}

属性已正确绑定,并在控件值更改时发出警报。问题是,标签前景的颜色永远不会改变。我尝试在样式中为前景硬编码一个值(例如:红色),但它仍然没有改变。

作为最后的手段,我尝试将控件的可见性状态更改为Hidden而不是更改前景的值并且它有效。标签会相应地隐藏和显示自己。

为什么我无法在样式的触发器中更改前景的值?

我正在使用Expression Blend 4以及手动编辑代码。我也在使用PRISM 4。

2 个答案:

答案 0 :(得分:4)

由于{{3},您不得在Forground本身上设置Label本地值会覆盖样式触发器 }。因此触发器不会影响Foreground

虽然可以通过触发器覆盖Setter,因此您可以将值移动到样式设置器中。

答案 1 :(得分:1)

猜猜:

对我来说似乎应该删除Label定义Foreground="White",因为它克服了样式定义。而是添加

<Trigger Property="IsEnabled" Value="True">
       <Setter Property="Foreground" Value="White"/>
   </Trigger>

应该工作......