Стили наведения мыши на кнопках WPF со смешанным содержимым

StackOverflow https://stackoverflow.com/questions/1640739

Вопрос

У меня есть стандартная кнопка Style , примененная ко всему моему приложению, которая задает стиль наведения мыши, который изменяет текстовое содержимое с белого на черный. Чтобы добиться этого, я попытался изменить шаблон кнопки, удалив ContentPresenter и заменив его на TextBlock . Однако это означает, что у меня не может быть смешанного контента, такого как:

<Button
    <Button.Content>
        <StackPanel Orientation="Horizontal">
            <Path Margin="3" Width="12.375" Height="9.70833" Canvas.Left="0" Canvas.Top="0"
                  Stretch="Fill" Fill="#FF115485"
                  Data="F1 M 18.8333,7.08333L 16.7083,4.91667L 10.5,10.5417L 8.52083,8.6875L 6.45833,10.4792L 10.4792,14.625L 18.8333,7.08333 Z "/>
            <TextBlock Margin="3">Hello</TextBlock>
        </StackPanel>
    </Button.Content>
</Button>

Чтобы улучшить ситуацию, я затем снова вставил ContentPresenter , и на моих (только текстовых) кнопках был указан ContentTemplate , например:

<Button IsDefault="True" Content="Text only Button"
        ContentTemplate="{StaticResource TextButtonTemplate}"
        Command="{Binding ...}" 
        CommandParameter="{...}" />

И с шаблоном , определенным, как показано ниже. Этот шаблон будет работать только для Button с текстовым содержимым, а другие шаблоны будут определены как необходимые для смешанного содержимого.

<DataTemplate x:Key="TextButtonTemplate">
    <TextBlock Text="{TemplateBinding Content}"
               Foreground="{Binding Path=Foreground,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Button}}" />
</DataTemplate>

Кто-нибудь знает, есть ли способ, как я могу улучшить это, сохранив желаемый стиль наведения мыши, без необходимости определять пользовательские шаблоны?

Это было полезно?

Решение

Предполагая, что содержимое явно не устанавливает какие-либо цвета самостоятельно, вы можете сделать это следующим образом:

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="TextBlock.Foreground" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>

Это работает, потому что TextBlock.Foreground является унаследованным свойством. Пока элементы управления внутри содержимого вашей кнопки явно не устанавливают свой собственный приоритет, это будет работать. Если они устанавливают свои собственные цвета, все ставки отключены.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top