Передний план кнопки не изменяется, когда содержимое является StackPanel - PullRequest
0 голосов
/ 01 июня 2018

У меня есть стиль кнопки, в котором шаблон имеет ContentPresenter с именем «contentPresenter».Затем он имеет триггер, настроенный так:

<ControlTemplate.Triggers>
    <Trigger Property="UIElement.IsEnabled" Value="False">
        <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="#FF838383" />
    </Trigger>
</ControlTemplate.Triggers>

Этот триггер просто меняет цвет переднего плана кнопки на серый, когда кнопка отключена.Тем не менее, в моем приложении есть одна кнопка, в которой нет простого текста.Кнопка выглядит следующим образом:

<Button Grid.Column="3" Grid.Row="3" Grid.ColumnSpan="2"
            Margin="120 20 30 10"
            Command="{Binding SomeCommand}">
        <StackPanel Orientation="Horizontal">
            <Image Source="{Binding MyImage}" Margin="0 0 2 0"
                   Visibility="{Binding ShowMyImage, Converter={StaticResource BooleanToVisibilityConverter}}"/>
            <TextBlock Text="{Binding ButtonText}" />
        </StackPanel>
    </Button>

Передний план этой кнопки всегда один и тот же, независимо от того, заблокирована кнопка или нет.Я думаю, это потому, что текст для кнопки находится в текстовом блоке на панели стека в представителе контента, но я не знаю, как заставить изменения цвета переднего плана применить к внутреннему текстовому блоку.

Я попытался изменить свойство в триггере, чтобы использовать «TextBlock.Foreground» вместо «TextElement.Foreground».Я также попытался привязать передний план внутреннего текстового блока к цвету переднего плана ближайшего предка типа FrameworkElement следующим образом:

<TextBlock Text="{Binding ButtonText}" Foreground="{Binding RelativeSource={RelativeSource AncestorType={x:Type FrameworkElement}}, Path=(FrameworkElement.Foreground)}" />

Ничего из этого не сработало.Что мне нужно сделать, чтобы цвет переднего плана применялся к TextBlock внутри StackPanel?

1 Ответ

0 голосов
/ 02 июня 2018

Ваш триггер должен быть в стиле и должен устанавливать передний план для самой кнопки, а не для ContentPresenter.Тогда это будет просто работать, с пользовательским шаблоном или с шаблоном по умолчанию.Нет необходимости в каких-либо дополнительных привязках.

<Style TargetType="Button" x:Key="MyButtonStyle">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border Background="Beige" BorderBrush="Black" BorderThickness="1" Padding="6,2">
                    <ContentPresenter 
                        />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Foreground" Value="#FF838383" />
        </Trigger>
    </Style.Triggers>
</Style>

Использование:

<Button
    IsEnabled="False"
    Style="{StaticResource MyButtonStyle}"
    >
    <StackPanel>
        <TextBlock 
        >Blah Blah</TextBlock>
        <Button>X</Button>
    </StackPanel>
</Button>
<Button Style="{StaticResource MyButtonStyle}" IsEnabled="False">Testing</Button>

Снимок экрана (не берите в голову мой уродливый шаблон):

enter image description here

...