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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top