Styles de souris sur les boutons WPF à contenu mixte
-
08-07-2019 - |
Question
J'ai un bouton
style
standard appliqué dans mon application qui spécifie un style de survol qui modifie le contenu du texte du blanc au noir. Pour ce faire, j'ai essayé de modifier le modèle de bouton, en supprimant ContentPresenter
et en le remplaçant par un TextBlock
. Cependant, cela signifie que je ne peux pas avoir un contenu mixte tel que:
<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>
Pour améliorer la situation, j'ai ensuite réinséré le ContentPresenter
et mes boutons (texte uniquement) ont spécifié un ContentTemplate
comme ceci:
<Button IsDefault="True" Content="Text only Button"
ContentTemplate="{StaticResource TextButtonTemplate}"
Command="{Binding ...}"
CommandParameter="{...}" />
Et avec un modèle
défini comme ci-dessous. Ce modèle fonctionnera uniquement avec les Bouton
avec un contenu textuel, avec d’autres modèles définis selon les besoins pour un contenu mixte.
<DataTemplate x:Key="TextButtonTemplate">
<TextBlock Text="{TemplateBinding Content}"
Foreground="{Binding Path=Foreground,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Button}}" />
</DataTemplate>
Est-ce que quelqu'un sait s'il est possible de l'améliorer davantage en conservant le style de survol souhaité, sans avoir à définir de modèles personnalisés?
La solution
En supposant que le contenu ne définisse pas explicitement les couleurs, vous pouvez le faire comme suit:
<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>
Cela fonctionne car TextBlock.Foreground est une propriété héritée. Tant que les contrôles dans le contenu de votre bouton ne définissent pas explicitement leur propre avant-plan, cela fonctionnera. S'ils définissent leurs propres couleurs, tous les paris sont ouverts.