Как изменить передний план текста заголовка табуляции WPF onClick?

Как я могу изменить только цвет переднего плана текста заголовка 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>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавление триггера в шаблон управления 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>

Спасибо, я уже пробовал это, прежде чем публиковать этот вопрос, и это не сработало ... оказывается, когда я задавал Foreground цвет внутри окна <Tabitem ...>, он всегда показывал этот цвет. После удаления это работает как положено.

Jayanta_KMC 17.03.2022 03:06

Кстати, у меня был textblock внутри этого Tabitem, и его Foreground цвет также менялся, так что мне нужно установить цвет Foreground для каждого элемента управления/элемента внутри tabitem? Я только хотел изменить цвет текста заголовка. Это вообще возможно?

Jayanta_KMC 17.03.2022 03:06

@Jayanta_KMC Да, вы правы, оригинальное решение повлияло и на контент TabItem. Я заменил его двумя другими подходами, которые должны вам подойти.

thatguy 17.03.2022 08:43

Спасибо за ваше обновление. В основном я хочу установить определенный цвет Foreground, скажем, Red только для части <Tabitem Header = "..." ....>, когда она выбрана/активна. Все элементы управления, такие как label, TextBlock, Datagrid, ... и т. д., их Foreground цвет не должен меняться. Как я могу это сделать ? Должен ли второй подход, т.е. <Setter Property = "HeaderTemplate">, быть достаточным? Где я могу разместить этот код в моем стиле Tabcontrol?

Jayanta_KMC 17.03.2022 14:36

@Jayanta_KMC Вы должны использовать либо подход с ContentPresenter, либо собственный шаблон заголовка. Оба нацелены только на заголовок не содержимое вкладки. Шаблон заголовка элемента вкладки по умолчанию — это просто TextBlock. С вашей стороны, если у вас есть собственный шаблон заголовка, который содержит другие элементы управления, которые, в свою очередь, содержат TextBlocks, то подход ContentPresenter также влияет на них. В этом случае просто примените стиль второго подхода к тому TextBlock внутри шаблона заголовка, который вы хотите.

thatguy 17.03.2022 15:12

Во втором подходе вы просто помещаете этот Setter прямо внутри стиля <Style TargetType = "TabItem"> рядом с другими сеттерами.

thatguy 17.03.2022 15:12

Большое спасибо :) Я также добавил Setter для Property = "FontWeight" под <Setter Property = "Foreground" ..., и, кажется, это тоже работает. Надеюсь проблем не будет!

Jayanta_KMC 17.03.2022 15:44

Другие вопросы по теме