Как установить цвет фона кнопки, к которой применен стиль, из кода?

Итак, у меня есть кнопка, к которой применен стиль. Код для кнопки такой:

<Button Command="w:Command.ShowTBDisplay" Style="{DynamicResource button_displayOptions}" Content="Display TextBlock" Height="34.5" Margin="0,4,0,0" Name="btn_displayTB" />

Когда кнопка нажата, я хочу изменить цвет ее фона (постоянно, пока не будет нажата другая кнопка). Цвет, который я хочу использовать, является динамическим ресурсом.

Внутри метода ShowTBDisplay_Executed у меня есть такой код:

btn_displayTB.Background = FindResource("cClickColor") as Brush;

Но когда я это делаю, ничего не происходит, цвет не устанавливается.

Я полагаю, что цвет стиля переписывает все, что я пытаюсь изменить, на... но я не уверен.

Итак, как мне изменить backColor кнопки со стилем, примененным к ней?

Вот стиль кнопки, а также цвет, который я хочу использовать (оба стиля находятся в файле app.xaml):

<Style x:Key="button_displayOptions" TargetType="{x:Type Button}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Grid>
                        <Rectangle x:Name="rectangle" Fill="{DynamicResource cMenuBackground}"/>
                            <ContentPresenter x:Name="tb" TextBlock.Foreground="White" HorizontalAlignment="Left" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center" Margin="8,5,0,5" Height="19.5"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsFocused" Value="True"/>
                            <Trigger Property="IsDefaulted" Value="True"/>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Fill" TargetName="rectangle" Value="{DynamicResource cMenuItemHighlight}"/>
                                <Setter Property="TextBlock.Foreground" TargetName="tb" Value="Black"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True"/>
                            <Trigger Property="IsEnabled" Value="False"/>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

<SolidColorBrush x:Key="cMenuItemHighlight">#FFAFAFAF</SolidColorBrush>

Спасибо!

1 ответ

Решение

Ваш шаблон переопределяет шаблон по умолчанию и Background свойство Button больше ничего не делает, вам нужно привязать некоторый элемент управления внутри шаблона к свойству, используя TemplateBinding например.

Изменить: Прямоугольник не должен иметь конкретное значение заливки в шаблоне, это, вероятно, то, что вы хотите:

<Style x:Key="button_displayOptions" TargetType="{x:Type Button}">
    <Setter Property="Background" Value="{DynamicResource cMenuBackground}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid>
                    <Rectangle x:Name="rectangle" Fill="{TemplateBinding Background}" />
                    <ContentPresenter x:Name="tb" TextBlock.Foreground="White" HorizontalAlignment="Left"
                            RecognizesAccessKey="True"
                            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                            VerticalAlignment="Center" Margin="8,5,0,5" Height="19.5" />
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsFocused" Value="True" />
                    <Trigger Property="IsDefaulted" Value="True" />
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Fill" TargetName="rectangle"
                                Value="{DynamicResource cMenuItemHighlight}" />
                        <Setter Property="TextBlock.Foreground" TargetName="tb" Value="Black" />
                    </Trigger>
                    <Trigger Property="IsPressed" Value="True" />
                    <Trigger Property="IsEnabled" Value="False" />
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Обратите внимание на новый Setter который устанавливает Background на ваш ресурс и внутренний TemplateBinding на Rectangle.Fill,

Другие вопросы по тегам