La définition de la couleur de premier plan de TabItem définit également la couleur de premier plan de TabControl
J'ai un TabControl que j'ai relooké. Le TabItem a un trigger est déclenché quand le TabItem est sélectionnée, qui modifie la TabItem texte en gras et en vert. Le problème que j'ai, c'est que le texte dans le contenu de l'onglet est également mis en gras et en vert.
Je peux contourner ce problème en définissant l'ensemble de mes commandes dans l'onglet de contenu à la couleur et la police de poids que je veux, mais dois-je le faire? Donc, je dois veiller à ce que tous les textblock dans la zone de contenu a un style qui définit la couleur au noir et la police de poids normal.
Comment puis-je régler le IsSelected partie de la TabItem verte, mais laissez le contenu de l'onglet seul?
J'ai essayé de mettre au premier plan de la TabControl en noir, mais cela ne fonctionne pas.
Vous verrez à partir de l'exemple de code ci-dessous que le texte sur le premier onglet est vert, et je veux qu'il soit noir, mais sans fixer de chaque contrôle dans l'onglet de contenu.
Exemple de Code ci-dessous:
<Grid>
<Grid.Resources>
<!-- Tab item -->
<Style TargetType="{x:Type TabItem}">
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinWidth" Value="200"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid>
<Border Name="Border" Padding="5,2">
<ContentPresenter ContentSource="Header"/>
</Border>
</Grid>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Border.IsMouseOver" Value="True"/>
<Condition Property="IsSelected" Value="False"/>
</MultiTrigger.Conditions>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="Black"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Border.IsMouseOver" Value="False"/>
<Condition Property="IsSelected" Value="False"/>
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="Black" />
</MultiTrigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="Green"/>
<Setter Property="FontWeight" Value="Bold"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- Tab control -->
<Style TargetType="{x:Type TabControl}">
<Setter Property="SelectedIndex" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabControl}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Padding="5" Margin="0,0,5,0" CornerRadius="3">
<StackPanel Orientation="Vertical">
<ScrollViewer VerticalScrollBarVisibility="Auto" FocusVisualStyle="{x:Null}">
<TabPanel IsItemsHost="True"/>
</ScrollViewer>
</StackPanel>
</Border>
<Border Grid.Column="1" BorderBrush="Black" BorderThickness="0">
<ScrollViewer VerticalScrollBarVisibility="Auto" FocusVisualStyle="{x:Null}" Padding="10,0">
<ContentPresenter ContentSource="SelectedContent"/>
</ScrollViewer>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<TabControl Name="tabControl" TabStripPlacement="Left">
<!-- First tab item -->
<TabItem IsSelected="True">
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Profile"/>
</StackPanel>
</TabItem.Header>
<TextBlock Text="Page 1 Sample Text with no foreground set." FontSize="30"/>
</TabItem>
<!-- Second tab item -->
<TabItem IsSelected="True">
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Profile"/>
</StackPanel>
</TabItem.Header>
<TextBlock Text="Page 2 Sample Text with foreground set manually." FontSize="30" Foreground="Red"/>
</TabItem>
</TabControl>
</Grid>
source d'informationauteur Adrian
Vous devez vous connecter pour publier un commentaire.
Je viens de tomber sur ce même problème, et après de bidouiller un peu, je pense avoir trouvé une solution plus élégante.
Je dis plus élégant car il allait quitter l'ContentPresenter intact, et d'appliquer le premier plan et fontweight organismes de normalisation pour la ContentPresenter de TextElement (qui est en fait une propriété attachée, mais c'est à côté de la question).
Le principal avantage de cette approche est que le remplacement de la ContentPresenter avec un TextBlock suppose implicitement que l'en-tête contient uniquement du texte, ce qui limite l'utilisation de la solution de contournement et produit moins solide code. Laissant la ContentPresenter en place permettra à tout le contenu, par exemple, des images+texte.
Une chose que vous avez à faire est de nommer votre ContentPresenter:
Maintenant au premier plan et FontWeight ne sera pas héritées par le contenu de la TabItem (testé).
Profiter 🙂
C'est assez vieux, mais je suis tombé sur ça en cherchant une réponse à un problème similaire, et j'ai trouvé le fourni des réponses pas du tout utile.
Voici comment j'ai résolu ce.
Si vous modifiez le ContentPresenter à un TextBlock dans le modèle de contrôle de votre tabitem, comme ceci:
Puis dans votre déclencheur sur ce modèle de contrôle vous spécifiez le targetname dans le IsSelected déclencheur..ie.
Qui devrait vous donner un texte en vert lorsque l'onglet est sélectionné, et non pas vert toutes les autres fois, tout en laissant le texte de coloration dans le reste de l'app seul.
Malheureusement, si vous définissez l'avant-plan (ou FontWeight) sur un ContentPresenter par une certaine détente, vous avez encore supposer que l'en-tête contient uniquement du Texte.
Si vous définissez l'en-Tête="SomeHeaderName" (texte seulement), le ContentPresenter va générer un TextBlock pour l'accueil de cette headertext; la ContentPresenter sera la (logique) parent de ce TextBlock et donc, le nouveau premier plan situé sur la ContentPresenter sera héritée par cette TextBlock. Cela fonctionne ok.
Cependant, si l'en-Tête est affecté d'une partie de l'arborescence visuelle, comme une horizontale StackPanel avec une Image et d'un TextBlock (ou même un seul TextBlock), puis le parent logique de la StackPanel est le TabItem et pas le ContentPresenter. L'héritage fonctionne via l'arborescence logique, et donc le TextBlock à l'intérieur de la StackPanel sera finalement hériter de son premier plan de l'TabItem de nouveau; le de premier plan qui a été mis sur la ContentPresenter n'a aucun effet sur ce.
Une solution possible: un DataTemplate est finalement appliquée à un ContentPresenter, de sorte que le TemplatedParent de la racine du DataTemplate est le ContentPresenter; et l'héritage fonctionne par le biais d'un TemplatedParent-Enfant de la barrière. Donc, si vous êtes en mesure de définir la TabItem.HeaderTemplate au lieu de la TabItem.L'en-tête, puis vous peut mis au premier plan sur l'en-tête du ContentPresenter, parce que la racine de la HeaderTemplate hériteront le premier plan de l'ContentPresenter. Le SelectedContent cependant, ne sera pas parce que le premier plan n'est pas mis sur la TabItem (et le contenu hérite de son premier plan de l'TabItem).
Espérons que cette aide!
Chaque contrôle dans wpf hérite des propriétés de son parent. Depuis le TabItem de couleur noir, son enfant
textblock
est également de couleur noire. Maintenant, puisque vous avez changé l'ensemble de la TabItem de premier-plan la couleur au vert, tous ses enfants en hériteront.Ici, vous pouvez définir votre TabItem.L'en-tête ou de son contenu' avant-plan de vert, de sorte qu'il ne sera pas affecter d'autres contenus dans le TabItem. D'autre, vous pouvez inverser la solution.
D'autre, Essayez ceci: