2009-07-15 9 views
0

Ich versuche, die Vordergrundtextfarbe eines Header-Textblock WPF Registerkarte Element mithilfe von Triggern zu ändern. Dies funktioniert für die meisten (einfacheren) Szenarien, aber nicht, wenn TextBlocks global formatiert wurden.WPF Formatierung Tabitem Text Vordergrund bei Trigger wie IsEnabled, IsMouseOver, etc

Also das einfache „Maus über“ Trigger in Bezug auf die Änderung der Vordergrundfarbe arbeiten würde:

<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> 

Das Problem ist, dass, wenn Textblocks werden global in App.xaml (zur Aufrechterhaltung eines einheitlichen Look) Stil, Der Vordergrund ändert sich nicht, behält jedoch die global formatierte Vordergrundfarbe bei. Dies ist, wie meine Textblocks gestylt werden:

<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> 

Also meine Frage ist nicht die explizit definierte Stil Zuordnung (in TabItem den Trigger) Vorrang hat? Noch wichtiger, wie kann ich das umgehen, ohne allen meinen Textblöcken Stile einzeln zuzuweisen, aber wenn der TabItem-Textblock die Farbe wie erwartet ändert?

Vielen Dank

NT

Antwort

2

Arbeiten für mich. Gerade hatte, dies zu ändern:

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

dazu:

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

Sie die Vordergrundfarbe eines TabItem zu Red Einstellung, nicht der Textblock. Möglicherweise wird der TextBox-Stil nicht von TabItem geerbt, da implizite Stile des Benutzersatzes Vorrang vor den Trigger-Sätzen haben.

Versuchen Sie, eine Bindung zur übergeordneten TabItem Foreground-Eigenschaft des TextBlocks hinzuzufügen.

EDIT

Gefällt Ihnen dieses

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

Was ich war gemeint:

<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> 

Bindung der TabItem Eltern findet und bindet sich an seine Vordergrund Eigenschaft.

0

Vielen Dank für Ihre Hilfe, Sie haben mich erfolgreich in die richtige Richtung gelenkt.

Meine Absicht war es, den TabItem-Text zu ändern (Erstellt von WPF ContentPresenter) im Gegensatz zu dem TextBlock innerhalb der Registerkarte, die in XAML deklariert ist und leicht die Farbe ändern kann.

Das Problem war, dass der globale Stil Vorrang hatte. Und da der TextBlock von WPF erstellt und nicht von mir deklariert wurde, konnte ich nicht darauf zugreifen.

Die Lösung war die Content Ressourcen, die als solche zu spezifizieren:

<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> 

Wie Sie mir den TextBlock- Stil innerhalb der Content Ressourcen gesetzt haben sehen können. Offensichtlich sollten nun alle TextBlocks innerhalb des ContentPresenters die Foreground-Eigenschaft des Elternteils verwenden, und dies wird wegen der Wertumwandlung Vorrang haben und mein Problem lösen.

Vielen Dank an alle,

NT