WPF: Не меняется фон кнопки, когда меняю IsEnabled = false

382
03 сентября 2017, 00:28

Поскольку в WPF так просто менять фон нельзя при установки IsEnabled = false у кнопки, то я сделал свой Стиль и изменил шаблон и указал начальные сеттеры: фон, цвет шрифта итд. Так же 1 триггер на чтобы менять фон и несколько мультитриггеров, чтобы при смене контента кнопки и когда кнопка будет актив = false, менялся цвет шрифта, но фон такой же:

<Style TargetType="Button" x:Key="ButtonForeground">
        <Setter Property="OverridesDefaultStyle" Value="True" />
        <Setter Property="Background" Value="MediumAquamarine" />
        <Setter Property="Foreground" Value="MediumBlue" />
        <Setter Property="IsEnabled" Value="True" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid Background="{TemplateBinding Background}">
                        <ContentPresenter x:Name="MyContentPresenter" 
                                      Content="{TemplateBinding Content}"
                                      HorizontalAlignment="Center" 
                                      VerticalAlignment="Center" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsEnabled" Value="False"></Condition>
                    <Condition Property="Content" Value="1"></Condition>
                </MultiTrigger.Conditions>
                <MultiTrigger.Setters>
                    <Setter Property="Background" Value="#999"/>
                    <Setter Property="Foreground" Value="Blue"/>
                </MultiTrigger.Setters>
            </MultiTrigger>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsEnabled" Value="False"></Condition>
                    <Condition Property="Content" Value="2"></Condition>
                </MultiTrigger.Conditions>
                <MultiTrigger.Setters>
                    <Setter Property="Background" Value="#999"/>
                    <Setter Property="Foreground" Value="Green"/>
                </MultiTrigger.Setters>
            </MultiTrigger>
        </Style.Triggers>
    </Style>

Но проблема в том, что когда я применяю стиль к кнопке (в коде), а потом переопределить цвет фона (тоже в коде), этот фон не меняется на тот, который указан в стиле, меняется только цвет контента, актив же стоит false. Мне же нужно чтобы мультитриггеры полноценно применялись и я мог переопределять фон. Вот код в c#:

 int c = 0;
    public MainWindow()
    {
        InitializeComponent();
        asdasd.Style = Application.Current.Resources["ButtonForeground"] as Style;
        asdasd.Background = Brushes.Black; // - Вот тут (если закоментить строку то норм)
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        asdasd.Content = c++.ToString();
    }
    private void asdasd_Click(object sender, RoutedEventArgs e)
    {
        asdasd.IsEnabled = false; // asdasd - это нижняя кнопка :)
    }

Если не комментить строку то будет так:

А если закомментить, то так:

READ ALSO
Как получить имя переменной в виде строки?

Как получить имя переменной в виде строки?

Не значение переменной, а именно её имя

334
Неизвестная конструкция объект/json f({&ldquo;a&rdquo;:&ldquo;b&rdquo;})

Неизвестная конструкция объект/json f({“a”:“b”})

Пришлось разбираться в чужом javascript кодеНаткнулся на такого типа конструкцию Имеет вид

339