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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top