【问题标题】:How to implement event triggered WPF control style change如何实现事件触发的 WPF 控件样式更改
【发布时间】:2014-09-12 03:22:50
【问题描述】:

我的 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 属性的绑定工作正常。所以 IsEnabled 从我的 ViewModel 中得到正确设置。

但我的问题是我的 IsEnabled &lt;ControlTemplate.Triggers&gt; 的样式不会在 UI 中自动加载/刷新。我总是必须先单击任何其他控件。一旦我点击另一个控件,按钮的样式也会改变。

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

编辑:

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

在我的 ViewModel 中我实现了:

CommandManager.InvalidateRequerySuggested();

通过调用此方法,控件得到刷新。 如果给定启用按钮的条件,我只是在我的属性之一中调用它..

提前致谢!

【问题讨论】:

    标签: c# wpf button styles


    【解决方案1】:

    再创建一个触发器并设置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>
    

    【讨论】:

    • 我之前已经试过了。它也不会改变样式。
    • 能否请将您的代码发给我,以便我为您提供解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2023-03-07
    • 2019-01-12
    • 2023-01-28
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多