estilos mouseover no WPF botões com conteúdo misto
-
08-07-2019 - |
Pergunta
Eu tenho um Button
Style
padrão aplicado transversalmente meu aplicativo que especifica um estilo de mouseover que muda o conteúdo do texto do branco ao preto. Para conseguir isso eu tentei modificar o modelo botão, removendo o ContentPresenter
e substituí-lo com um TextBlock
. No entanto, isso significa que eu não posso ter conteúdo misto, tais como:
<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>
Para melhorar a situação, eu em seguida, colocar a parte de trás ContentPresenter
, e no meu (só texto) botões especificou um ContentTemplate
assim:
<Button IsDefault="True" Content="Text only Button"
ContentTemplate="{StaticResource TextButtonTemplate}"
Command="{Binding ...}"
CommandParameter="{...}" />
E com um Template
definido como abaixo. Este modelo só irá funcionar para Button
s com conteúdo textual, com outros modelos definidos conforme necessário para conteúdo misto.
<DataTemplate x:Key="TextButtonTemplate">
<TextBlock Text="{TemplateBinding Content}"
Foreground="{Binding Path=Foreground,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Button}}" />
</DataTemplate>
Alguém sabe se existe uma maneira que eu posso melhorar isso ainda mais, mantendo o estilo mouseover desejado, sem ter que definir modelos personalizados?
Solução
Assumindo que o conteúdo não definir explicitamente todas as cores em seu próprio país, você pode fazer isso assim:
<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>
Isso funciona porque TextBlock.Foreground é uma propriedade herdada. Enquanto os controles dentro conteúdo do seu botão não definir explicitamente o seu próprio plano, isso vai funcionar. Se eles definir suas próprias cores, todas as apostas estão fora.