2016-10-28 1 views
1

Mon ControlTemplate global (App.xaml) pour Button ne souhaite pas remplacer la propriété Foreground par sa couleur noire par défaut. Cela semble être un problème relativement commun, mais j'ai essayé diverses solutions, y compris la définition du BasedOn à null comme described in this question.WPF Button ControlTemplate ne remplace pas Inherited Foreground

Mon code est ci-dessous, et vous pouvez voir que j'ai essayé d'indiquer explicitement la couleur de premier plan à la fois sur le Grid et le ContentPresenter. Pourtant, la couleur reste noire. Snoop me dit qu'il est hérité en tant que défaut, mais ne semble pas dire d'où, et montre le ContentPresenter parent ayant TextElement.Foreground mis à la bonne couleur.

Y a-t-il quelque chose dans ce code que je devrais paramétrer? Ai-je manqué un élément ou une propriété?

<Style TargetType="Button"> 
    <Setter Property="SnapsToDevicePixels" Value="true" /> 
    <Setter Property="HorizontalContentAlignment" Value="Center"/> 
    <Setter Property="VerticalContentAlignment" Value="Center"/> 
    <Setter Property="VerticalAlignment" Value="Center" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Grid x:Name="grid" TextBlock.Foreground="#FFD3D3D2"> 
        <Border x:Name="border" Background="Transparent" BorderBrush="#FF5C7999" BorderThickness="2" CornerRadius="{Binding RelativeSource={RelativeSource TemplatedParent},Path=ActualHeight,Converter={StaticResource HalfConverter}}" Padding="10"> 
         <ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10,0" TextBlock.Foreground="#FFD3D3D2"> 
         </ContentPresenter> 
        </Border> 
       </Grid> 
... 
+1

Je ne peux pas reproduire le problème en fonction de ce que vous avez ici. Dans quel contexte le bouton apparaît-il? Qu'est-ce que vous utilisez pour 'Content'? –

+0

En fait, je * peux * le reproduire: '' obtient moi un noir "Foo". –

+0

Je peux mettre un 'Style' implicite pour' Label' dans 'ControlTemplate.Resources', qui s'appliquera au contenu' Label'. –

Répondre

1

Transforme que les boutons en utilisant ce style mettaient leur contenu à des choses autres que le texte, ou en ajoutant explicitement un style moins TextBlock à l'intérieur, ce qui est tout remplacer le jeu par les Foreground attributs dans le code d'origine.

Garantir que seulement texte a été défini comme le contenu du bouton, ou s'assurer que les emballages de ceux-ci ont été stylés de manière appropriée, a résolu le problème.

Il semble que le débogage de canard en caoutchouc fonctionne après tout.

1

Test cela, vos Style fonctionne comme prévu si Button.Content est une chaîne, mais pas si elle est un contrôle:

<StackPanel> 
    <Button Content="Gray Text As Specified in the ControlTemplate" /> 
    <Button><Label>Default Black Text</Label></Button> 
</StackPanel> 

Je peux ajouter un style Label implicite à ControlTemplate.Resources qui l'emporte sur Foreground du Label, mais il serait ridicule d'essayer d'avoir des styles implicites locaux pour tous les contrôles possibles que quelqu'un pourrait y mettre. Mais si vous restez simplement avec des chaînes simples pour le Content, cela fonctionnera. Maintenant, je vais passer du temps à faire des recherches sur the inheritance rules for attached properties, parce que je pense que je suis à peu près à moitié sûr que ce n'est pas le comportement que je veux habituellement.

+0

Merci Ed. Upvoted si non seulement pour le "51% semi-confiant" -ness. – Dan