How to implement event triggered WPF control style change

一个人想着一个人 提交于 2020-01-06 08:52:46

问题


I have an style template for my Button control that looks like that:

<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>

My button instance itself:

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

The binding for the IsEnabled Property works fine. So the IsEnabled gets set correct from my ViewModel.

But my problem is that my Styles for IsEnabled <ControlTemplate.Triggers> do not get loaded/refreshed automatically in the UI. I always have to click to any other control first. Once i clicked to another control the style of the button changes also.

What can i do to automatically update the/refresh the style of the button/any control based on the IsEnabled event?

EDIT:

Finally i got it working with an workaround. Im not happy and im sure that there are better ways. But it works.

In my ViewModel i implemented:

CommandManager.InvalidateRequerySuggested();

By calling this method the controls get refreshed. I just call it in one of my Properties if the condition is given to enable the button..

Thanks in advance!


回答1:


Create one more trigger and set the style for 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>


来源:https://stackoverflow.com/questions/25800229/how-to-implement-event-triggered-wpf-control-style-change

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!