如何实现事件触发的WPF控件样式更改

时间:2014-09-12 03:22:51

标签: c# wpf button styles

我的Button控件的样式模板如下所示:

<Style x:Key="myBtnStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="border" Width="100" Height="25"
                        Padding="5,5,5,5" CornerRadius="5,5,5,5"
                        Background="LightGray" BorderBrush="Black" 
                        BorderThickness="1,1,1,1">
                    <ContentPresenter 
                        x:Name="cpButton" 
                        VerticalAlignment="Center"
                        HorizontalAlignment="Center"
                        Width="Auto"  Height="Auto" Margin="-6">
                    </ContentPresenter>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled"  Value="false">
                        <Setter Property="Background" TargetName="border" Value="GhostWhite"></Setter>
                        <Setter Property="BorderBrush" TargetName="border" Value="Gainsboro"></Setter>
                        <Setter Property="Foreground" Value="Gray"></Setter>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="true">
                        <Setter Property="Background" TargetName="border" Value="SkyBlue"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

我的按钮实例本身:

<Button Name="btnResetCount" Content="Reset" Command="{Binding Path=CalcViewModel.ResetCounter}" Style="{StaticResource myBtnStyle}" IsEnabled="{Binding IsButtonCounterEnabled,Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">

IsEnabled属性的绑定工作正常。因此,从我的ViewModel中设置IsEnabled是正确的。

但我的问题是我的样式IsEnabled <ControlTemplate.Triggers>没有在UI中自动加载/刷新。我总是先点击任何其他控件。一旦我点击另一个控件,按钮的样式也会改变。

如何根据IsEnabled事件自动更新/刷新按钮/任何控件的样式?

修改

最后,我得到了一个解决方法。我不高兴,我确信有更好的方法。但它确实有效。

在我实现的ViewModel中:

CommandManager.InvalidateRequerySuggested();

通过调用此方法,控件将刷新。 如果给出启用按钮的条件,我只是在我的一个属性中调用它。

提前致谢!

1 个答案:

答案 0 :(得分:0)

再创建一个触发器并设置IsEnabled=true的样式:

<Trigger Property="IsEnabled"  Value="true">
    <Setter Property="Background" TargetName="border" Value="Black"/>
    <Setter Property="BorderBrush" TargetName="border" Value="Black"/>
    <Setter Property="Foreground" Value="Gray"/>
</Trigger>