Стили наведения мыши на кнопках WPF со смешанным содержимым - PullRequest
1 голос
/ 29 октября 2009

У меня есть стандартное Button 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="{...}" />

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

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

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

1 Ответ

1 голос
/ 29 октября 2009

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

<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 является унаследованным свойством. Пока элементы управления внутри содержимого вашей кнопки явно не устанавливают свой собственный приоритет, это будет работать. Если они устанавливают свои собственные цвета, все ставки отключены.

...