Stili di passaggio del mouse sui pulsanti WPF con contenuto misto
-
08-07-2019 - |
Domanda
Ho un pulsante standard
Style
applicato attraverso la mia applicazione che specifica uno stile al passaggio del mouse che cambia il contenuto del testo da bianco a nero. Per raggiungere questo obiettivo ho provato a modificare il modello di pulsante, rimuovendo ContentPresenter
e sostituendolo con un TextBlock
. Tuttavia, ciò significa che non posso avere contenuti misti come:
<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>
Per migliorare la situazione, ho quindi reinserito ContentPresenter
e sui miei pulsanti (solo testo) ho specificato un ContentTemplate
come questo:
<Button IsDefault="True" Content="Text only Button"
ContentTemplate="{StaticResource TextButtonTemplate}"
Command="{Binding ...}"
CommandParameter="{...}" />
E con un Template
definito come di seguito. Questo modello funziona solo con Button
con contenuto testuale, con altri modelli definiti come necessari per contenuto misto.
<DataTemplate x:Key="TextButtonTemplate">
<TextBlock Text="{TemplateBinding Content}"
Foreground="{Binding Path=Foreground,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Button}}" />
</DataTemplate>
Qualcuno sa se c'è un modo per migliorare ulteriormente mantenendo lo stile desiderato per il passaggio del mouse, senza dover definire modelli personalizzati?
Soluzione
Supponendo che il contenuto non imposti esplicitamente alcun colore da solo, puoi farlo in questo modo:
<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>
Funziona perché TextBlock.Foreground è una proprietà ereditata. Finché i controlli all'interno dei contenuti del tuo Button non impostano esplicitamente il loro primo piano, questo funzionerà. Se impostano i propri colori, tutte le scommesse sono disattivate.