2009-10-28 3 views
1

J'ai un Style standard appliqué à travers mon application qui spécifie un style de survol qui change le contenu du texte du blanc au noir. Pour y parvenir, j'ai essayé de modifier le modèle de bouton, en supprimant le ContentPresenter et en le remplaçant par un TextBlock. Cependant, cela signifie que je ne peux pas avoir un contenu mixte tels que:Styles de survol sur les boutons WPF avec contenu mixte

<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, je mets ensuite les boutons ContentPresenter de retour, ainsi que sur mon (texte seulement) spécifié un ContentTemplate comme celui-ci:

<Button IsDefault="True" Content="Text only Button" 
     ContentTemplate="{StaticResource TextButtonTemplate}" 
     Command="{Binding ...}" 
     CommandParameter="{...}" /> 

Et avec un Template défini comme ci-dessous. Ce modèle ne fonctionnera que pour Button avec du contenu textuel, avec d'autres modèles définis comme nécessaires pour le 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 y a un moyen de l'améliorer en gardant le style de passage de souris désiré, sans avoir à définir de modèles personnalisés?

Répondre

1

En supposant que le contenu ne définissez pas explicitement toutes les couleurs sur lui-même, vous pouvez accomplir cela comme ceci:

<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 parce que TextBlock.Foreground est une propriété héritée. Tant que les contrôles à l'intérieur du contenu de votre bouton ne définissent pas explicitement leur propre premier plan, cela fonctionnera. S'ils définissent leurs propres couleurs, tous les paris sont désactivés.

+0

Merci pour votre réponse. Je n'avais rien fait avec des propriétés héritées auparavant. Malheureusement, mes TextBlocks définissent leurs propres couleurs, car je ne veux pas qu'ils utilisent le système par défaut. Je peux devoir poster une nouvelle question sur celui-là ..... –

+0

Ne fonctionne pas pour moi. – flq

Questions connexes