WPF-styling tabitem text Vordergrund-auf-trigger wie IsEnabled, IsMouseOver, etc
Ich versuche, ändern Sie die Vordergrund-Textfarbe eines WPF-tab-item-header textblock löst. Dies funktioniert gut für die meisten (einfacheren) Szenarien aber nicht, wenn TextBlocks wurden weltweit gestylt.
Also dieses einfache "mouse-over" - trigger funktionieren würde in Bezug auf die änderung der Vordergrund-Farbe:
<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 Global gestylt in App.xaml (für die Aufrechterhaltung einer konsistenten look), der Vordergrund ändert sich nicht, sondern behält die Global gestylt Vordergrundfarbe. Dies ist, wie mein TextBlocks Stil:
<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, sollte nicht auf die explizit definierten Stil-Zuordnung (in TabItem-trigger) Vorrang haben? Noch wichtiger ist, wie kann ich dies umgehen ohne zuweisen von Stilen, um alle meine Textblöcke individuell, aber die TabItem-textblock ändern, Farbe wie erwartet?
Vielen Dank
NT
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser link könnte dir helfen.
Ändern Sie die Vordergrundfarbe einer contentpresenter in einer listbox
Es wird erläutert, wie ändern Sie die Vordergrundfarbe einer contentpresenter.
Funktioniert für mich. Nur hatte dies zu ändern:
zu diesem:
Legen Sie die Vordergrundfarbe für ein TabItem zu Rot, nicht auf den TextBlock aus.
Vielleicht die TextBox style ist nicht geerbt von TabItem, weil user set implizite styles haben Vorrang vor den trigger-setter.
Versuchen Sie, eine Bindung an den TextBlock übergeordneten TabItem-Foreground-Eigenschaft.
BEARBEITEN
Wie diese
Was ich meinte, war dies:
Bindung findet den Elternteil TabItem und bindet sich an seine Foreground-Eigenschaft.
Vielen Dank für Ihre Hilfe, Sie erfolgreich lotste mich in die richtige Richtung.
Meine Absicht war, zu ändern, die TabItem-text (Erstellt von WPF ContentPresenter) im Gegensatz zu den TextBlock innerhalb der Registerkarte, die erklärt wird in XAML und können ganz einfach die Farbe wechseln.
War das problem mit den globalen Stil Vorrang haben. Und als der TextBlock wird erstellt, indem WPF eher als erklärt von mir, ich konnte nicht darauf zugreifen.
War die Lösung, geben Sie den ContentPresenter-Ressourcen, die als solche:
Wie Sie sehen können ich habe den TextBlock-style innerhalb des ContentPresenter-Ressourcen.
So offensichtlich nun alle Textblöcke innerhalb der ContentPresenter die Eltern Foreground-Eigenschaft und dieser Vorrang durch Wert Zwang, die Lösung meines Problems.
Vielen Dank an alle,
NT