2009-07-15 8 views
0

J'essaie de changer la couleur du texte de premier plan d'un bloc de texte d'en-tête d'un élément de l'onglet WPF en utilisant des déclencheurs. Cela fonctionne bien pour la plupart des scénarios (plus simples), mais pas lorsque les TextBlocks ont été globalement stylisés.WPF style tabitem texte de premier plan sur le déclencheur tels que IsEnabled, IsMouseOver, etc

donc cette « souris sur » simple déclencheur pourrait fonctionner en termes de changement de la couleur de premier plan:

<Style x:Key="testTabItemStyle1" TargetType="{x:Type TabItem}"> 
<Setter Property="Foreground" Value="Black"/> 
<Setter Property="Background" Value="White"/> 
<Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
<Setter Property="VerticalContentAlignment" Value="Stretch"/> 
<Setter Property="Template"> 
    <Setter.Value> 
    <ControlTemplate TargetType="{x:Type TabItem}"> 
     <Grid SnapsToDevicePixels="true"> 
     <Border x:Name="Bd" Background="White" BorderBrush="Gray" BorderThickness="1,1,1,0"> 
      <ContentPresenter HorizontalAlignment="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" x:Name="Content" VerticalAlignment="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" ContentSource="Header"/> 
     </Border> 
     </Grid> 
     <ControlTemplate.Triggers> 
     <Trigger Property="IsMouseOver" Value="true"> 
      <Setter Property="Background" TargetName="Bd" Value="Black"/> 
      <Setter Property="Foreground" Value="False"/> 
     </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
    </Setter.Value> 
</Setter> 
</Style> 

Le problème est que lorsque TextBlocks sont globalement décorées dans App.xaml (pour maintenir un aspect cohérent), le premier plan ne change pas, mais conserve la couleur de premier plan de style global. Voici comment mes TextBlocks sont stylés:

<Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="FontFamily" Value="Arial"/> 
     <Setter Property="Foreground" Value="Brown"/> 
     <Setter Property="Margin" Value="4,0,4,0"/> 
     <Setter Property="TextTrimming" Value="CharacterEllipsis"/> 
     <Setter Property="TextWrapping" Value="NoWrap"/> 
     <Setter Property="VerticalAlignment" Value="Center"/> 
    </Style> 

Ma question est donc ne devrait pas l'attribution de style explicitement défini (dans le déclenchement de TabItem) ont priorité? Plus important encore, comment est-ce que je travaille autour de ceci sans assigner des styles à tous mes blocs de texte individuellement mais avoir le bloc de texte de TabItem change la couleur comme prévu?

Un grand merci

NT

Répondre

2

Works pour moi. Je viens juste de changer cela:

<Setter Property="Foreground" Value="False"/> 

à ceci:

<Setter Property="Foreground" Value="White"/> 
0

Vous définissez la couleur de premier plan d'un TabItem Red, le TextBlock. Le style TextBox n'est peut-être pas hérité de TabItem, car les styles implicites définis par l'utilisateur ont priorité sur les setters de déclenchement. Essayez d'ajouter une liaison à la propriété parent TabItem Forefront de TextBlock.

EDIT

Vous aimez cette

Foreground="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}, AncestorLevel=1}, Path=Foreground}" 
0

Ce que je voulais dire ceci:

<TabItem Header="Summary" x:Name="TabSummary" IsSelected="True" Style="{DynamicResource testTabItemStyle1}"> 
    <Border x:Name="TabSummaryBody" Margin="-5,-5,-5,-5"> 
      <StackPanel Margin="0,30,0,0" HorizontalAlignment="Center"> 
        <TextBlock Text="Please select a document using the tree view on your right to show its properties." 
           FontSize="16" 
           Foreground="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}, AncestorLevel=1}, Path=Foreground}"/> 
      </StackPanel> 
    </Border> 
</TabItem> 

trouve la liaison TabItem mère et se lie à sa propriété de premier plan.

0

Merci beaucoup pour votre aide, vous m'avez orienté avec succès dans la bonne direction.

Mon intention était de modifier le texte de TabItem (créé par ContentPresenter de WPF) par opposition au TextBlock dans l'onglet qui est déclaré en XAML et peut facilement changer de couleur.

Le problème était que le style global avait la priorité. Et comme le TextBlock est créé par WPF plutôt que déclaré par moi, je ne pouvais pas y accéder.

La solution était de préciser les ressources ContentPresenter, en tant que tel:

<ControlTemplate TargetType="{x:Type TabItem}"> 
<Grid SnapsToDevicePixels="true"> 
    <Border x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,1,1,0" Padding="{TemplateBinding Padding}"> 
    <ContentPresenter HorizontalAlignment="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" x:Name="Content" VerticalAlignment="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" ContentSource="Header" RecognizesAccessKey="True"> 
    <ContentPresenter.Resources> 
    <Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="Foreground" Value="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}"/> 
    </Style> 
    </ContentPresenter.Resources> 
    </ContentPresenter> 
    </Border> 
</Grid> 

Comme vous pouvez le voir, je définir le style de TextBlock dans les ressources ContentPresenter. Donc évidemment maintenant tout TextBlocks dans le ContentPresenter doit utiliser la propriété Foreground du parent et cela aura la priorité en raison de la coercition de valeur, résoudre mon problème.

Un grand merci à tous,

NT

Questions connexes