Как я могу изменить только цвет переднего плана текста заголовка TabItem, когда он выбран или активен, не изменяя передний план любого элемента внутри этого TabItem или чего-либо еще? Я новичок во всем этом, поэтому мне трудно понять, где в моем TabItem стиле я могу реализовать эту маленькую функцию и как.
Стиль TabControl, который я использую:
<Style
x:Key = "{x:Type TabControl}"
TargetType = "{x:Type TabControl}">
<Setter
Property = "BorderThickness"
Value = "0" />
<Setter
Property = "BorderBrush"
Value = "Transparent" />
<Setter
Property = "Background"
Value = "Transparent" />
<Setter
Property = "Template">
<Setter.Value>
<ControlTemplate
TargetType = "TabControl">
<Grid>
<Grid.RowDefinitions>
<RowDefinition
Height = "Auto" />
<RowDefinition
Height = "*" />
</Grid.RowDefinitions>
<Border
BorderThickness = "0,0,1,1"
BorderBrush = "#D0CEBF"
Grid.Row = "1">
<Border
BorderThickness = "{TemplateBinding BorderThickness}"
BorderBrush = "{TemplateBinding BorderBrush}">
<Border
Background = "{TemplateBinding Background}">
<ContentPresenter
ContentSource = "SelectedContent" />
</Border>
</Border>
</Border>
<TabPanel
Grid.Row = "0"
IsItemsHost = "true"
HorizontalAlignment = "Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style
TargetType = "TabItem">
<Setter
Property = "BorderThickness"
Value = "0" />
<Setter
Property = "BorderBrush"
Value = "Transparent" />
<Setter
Property = "Background"
Value = "Transparent" />
<Setter
Property = "VerticalContentAlignment"
Value = "Center" />
<Setter
Property = "HorizontalContentAlignment"
Value = "Center" />
<Setter
Property = "Template">
<Setter.Value>
<ControlTemplate
TargetType = "{x:Type TabItem}">
<!--In order to click on the blank part of the TabItem can be successfully selected-->
<Border
Background = "Transparent">
<Grid>
<Grid
x:Name = "g">
<Path
Fill = "{TemplateBinding Background}"
Margin = "0,0,0,-1"
Data = "M 20,40 L 0,40 0,40 C 4,40 10,36 10,30 L 10,10 C 10,0 16,0 20,0 L 155,0 C 165,0 173,0 ,175,6 L175,30 C 175,30 175,38 182,40 Z" />
</Grid>
<Border
BorderThickness = "{TemplateBinding BorderThickness}"
Padding = "{TemplateBinding Padding}">
<ContentPresenter
ContentSource = "Header"
HorizontalAlignment = "{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment = "{TemplateBinding VerticalContentAlignment}" />
</Border>
</Grid>
</Border>
<!--Add ControlTemplate.Triggers to change the background color of the selected TabItem.-->
<ControlTemplate.Triggers>
<Trigger
Property = "IsSelected"
Value = "false">
<Setter
Property = "Visibility"
TargetName = "g"
Value = "Hidden" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>





Добавление триггера в шаблон управления TabItem, к сожалению, также устанавливает цвет переднего плана содержимого TabItem при выборе вкладки, поэтому это не работает.
<Trigger Property = "IsSelected" Value = "True">
<Setter Property = "Foreground" Value = "Red" />
</Trigger>
Однако вы можете добавить неявный стиль TextBlock (без x:Key) внутри ресурсов ContentPresenter. Он будет применяться автоматически только к TextBlock внутри своей области, не затрагивая содержимое TabItem или даже другие элементы в пользовательском шаблоне заголовка, кроме TextBlock.
<ContentPresenter
ContentSource = "Header"
HorizontalAlignment = "{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment = "{TemplateBinding VerticalContentAlignment}" >
<ContentPresenter.Resources>
<Style TargetType = "{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger
Binding = "{Binding IsSelected, RelativeSource = {RelativeSource AncestorType = {x:Type TabItem}}}"
Value = "true">
<Setter
Property = "Foreground"
Value = "Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentPresenter.Resources>
</ContentPresenter>
Как вариант, специализированное решение — создать шаблон заголовка и поместить туда триггер. В этом случае он не заставляет переопределенный шаблон заголовка применять передний план к каждому TextBlock.
<Setter
Property = "HeaderTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text = "{Binding}">
<TextBlock.Style>
<Style TargetType = "{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger
Binding = "{Binding IsSelected, RelativeSource = {RelativeSource AncestorType = {x:Type TabItem}}}"
Value = "true">
<Setter
Property = "Foreground"
Value = "Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>
Кстати, у меня был textblock внутри этого Tabitem, и его Foreground цвет также менялся, так что мне нужно установить цвет Foreground для каждого элемента управления/элемента внутри tabitem? Я только хотел изменить цвет текста заголовка. Это вообще возможно?
@Jayanta_KMC Да, вы правы, оригинальное решение повлияло и на контент TabItem. Я заменил его двумя другими подходами, которые должны вам подойти.
Спасибо за ваше обновление. В основном я хочу установить определенный цвет Foreground, скажем, Red только для части <Tabitem Header = "..." ....>, когда она выбрана/активна. Все элементы управления, такие как label, TextBlock, Datagrid, ... и т. д., их Foreground цвет не должен меняться. Как я могу это сделать ? Должен ли второй подход, т.е. <Setter Property = "HeaderTemplate">, быть достаточным? Где я могу разместить этот код в моем стиле Tabcontrol?
@Jayanta_KMC Вы должны использовать либо подход с ContentPresenter, либо собственный шаблон заголовка. Оба нацелены только на заголовок не содержимое вкладки. Шаблон заголовка элемента вкладки по умолчанию — это просто TextBlock. С вашей стороны, если у вас есть собственный шаблон заголовка, который содержит другие элементы управления, которые, в свою очередь, содержат TextBlocks, то подход ContentPresenter также влияет на них. В этом случае просто примените стиль второго подхода к тому TextBlock внутри шаблона заголовка, который вы хотите.
Во втором подходе вы просто помещаете этот Setter прямо внутри стиля <Style TargetType = "TabItem"> рядом с другими сеттерами.
Большое спасибо :) Я также добавил Setter для Property = "FontWeight" под <Setter Property = "Foreground" ..., и, кажется, это тоже работает. Надеюсь проблем не будет!
Спасибо, я уже пробовал это, прежде чем публиковать этот вопрос, и это не сработало ... оказывается, когда я задавал
Foregroundцвет внутри окна<Tabitem ...>, он всегда показывал этот цвет. После удаления это работает как положено.