4

我希望在选项卡变为活动状态时更改 TabItem 文本的前景。我正在使用以下内容,在我更改选项卡中显示的内容类型之前工作正常:

<TabControl Style="{DynamicResource SidebarTabControl}">
    <TabItem Header="TabItem" Style="{DynamicResource SidebarTab}" />
</TabControl>

<Style x:Key="SidebarTabForegroundStyleSelected">
    <Setter Property="TextBlock.Foreground" Value="White" />
</Style>

<Style x:Key="SidebarTabForegroundStyle">
    <Setter Property="TextBlock.Foreground" Value="Black" />
</Style>

<Style x:Key="SidebarTab" TargetType="TabItem">
    <Setter Property="Padding" Value="10,12,2,12" />
    <Setter Property="BorderThickness" Value="0,1,0,1" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TabItem}">
                <Border Padding="{TemplateBinding Padding}" 
                    Name="tab" 
                    BorderThickness="{TemplateBinding BorderThickness}" 
                    BorderBrush="{StaticResource SidebarTabBorderBrush}"
                    SnapsToDevicePixels="True">
                    <ContentPresenter Style="{StaticResource SidebarTabForegroundStyle}" Name="content" ContentSource="Header" />
                </Border>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter TargetName="tab" Property="Background" Value="{StaticResource SidebarTabBackgroundBrushSelected}" />
                        <Setter TargetName="tab" Property="BorderBrush" Value="{StaticResource SidebarTabBorderBrushSelected}" />
                        <Setter TargetName="content" Property="Style" Value="{StaticResource SidebarTabForegroundStyleSelected}" />
                    </Trigger>
                    <Trigger Property="IsSelected" Value="False">
                        <Setter TargetName="tab" Property="Background" Value="{StaticResource SidebarTabBackgroundBrush}" />
                        <Setter TargetName="tab" Property="BorderBrush" Value="{StaticResource SidebarTabBorderBrush}" />
                        <Setter TargetName="content" Property="Style" Value="{StaticResource SidebarTabForegroundStyle}" />
                    </Trigger>
                </ControlTemplate.Triggers>

            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

当我将 TabItem 更改为:

<TabControl Style="{DynamicResource SidebarTabControl}">
    <TabItem Style="{DynamicResource SidebarTab}">
        <TabItem.Header>
            <StackPanel Orientation="Horizontal">
                <Image Height="16" Source="..\..\Icons\cog.png" />
                <TextBlock Text="TabItem" Margin="5,0,0,0" VerticalAlignment="Center" />
            </StackPanel>
        </TabItem.Header>
    </TabItem>
</TabControl>

选择选项卡时,文本的前景不再变为白色,当不再选择选项卡时,文本的前景变为黑色。其他一切仍然正常工作。

有谁知道是否有办法在上面的 XAML 中完成更改前景的颜色?

4

2 回答 2

5

将触发器从控件模板移动到样式:

<Grid>
    <Grid.Resources>
        <SolidColorBrush x:Key="SidebarTabBackgroundBrushSelected" Color="Gray"></SolidColorBrush>
        <SolidColorBrush x:Key="SidebarTabBorderBrushSelected" Color="Blue"></SolidColorBrush>
        <SolidColorBrush x:Key="SidebarTabBackgroundBrush" Color="LightGray"></SolidColorBrush>
        <SolidColorBrush x:Key="SidebarTabBorderBrush" Color="Green"></SolidColorBrush>

        <Style x:Key="SidebarTab" TargetType="TabItem">
            <Setter Property="Padding" Value="10,12,2,12" />
            <Setter Property="BorderThickness" Value="0,1,0,1" />
            <Setter Property="Foreground"  Value="Blue"></Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TabItem}">
                        <Border Padding="{TemplateBinding Padding}" 
                Name="tab" 
                BorderThickness="{TemplateBinding BorderThickness}" 
                BorderBrush="{StaticResource SidebarTabBorderBrush}"
                SnapsToDevicePixels="True">
                            <ContentPresenter Name="content"
                                              ContentSource="Header" />
                        </Border>

                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="True">
                                <Setter TargetName="tab" Property="Background" Value="{StaticResource SidebarTabBackgroundBrushSelected}" />
                                <Setter TargetName="tab" Property="BorderBrush" Value="{StaticResource SidebarTabBorderBrushSelected}" />
                            </Trigger>
                            <Trigger Property="IsSelected" Value="False">
                                <Setter TargetName="tab" Property="Background" Value="{StaticResource SidebarTabBackgroundBrush}" />
                                <Setter TargetName="tab" Property="BorderBrush" Value="{StaticResource SidebarTabBorderBrush}" />
                            </Trigger>
                        </ControlTemplate.Triggers>

                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Foreground" Value="Red"></Setter>
                </Trigger>
                </Style.Triggers>
        </Style>
    </Grid.Resources>
    <TabControl Style="{DynamicResource SidebarTabControl}">
        <TabItem Header="TabItem 1" Style="{DynamicResource SidebarTab}" />
        <TabItem Style="{DynamicResource SidebarTab}"  >
            <TabItem.Header>
                <StackPanel>
                    <TextBlock Text="a"></TextBlock>
                    <TextBlock Text="b"></TextBlock>
                </StackPanel>
            </TabItem.Header>
        </TabItem>
        <TabItem Header="TabItem 3" Style="{DynamicResource SidebarTab}" />
    </TabControl>
</Grid>
于 2009-07-02T22:20:39.840 回答
1

看起来问题正在出现,因为您设置了错误的属性:

<Style x:Key="SidebarTabForegroundStyleSelected">
    <Setter Property="TextBox.Foreground" Value="White" />
</Style>

<Style x:Key="SidebarTabForegroundStyle">
    <Setter Property="TextBox.Foreground" Value="Black" />
</Style>

您需要设置 TextElement.Foreground 或 TextBlock.Foreground

此外,由于它是一个继承属性,您可以直接在 TabItems 上设置 AttachedProperty,无需专门将其分配给内容。

<TabControl Style="{DynamicResource SidebarTabControl}">
    <TabControl.ItemContainerStyle>
        <Style TargetType="{x:Type TabItem}">
            <Style.Triggers>
                <Trigger Property="IsSelected"
                         Value="True">
                    <Setter Property="TextElement.Foreground"
                            Value="Red" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </TabControl.ItemContainerStyle>
    <TabItem>
        <TabItem.Header>
            <StackPanel Orientation="Horizontal">
                <Image Height="16"
                       Source="..\..\Icons\cog.png" />
                <TextBlock Text="TabItem"
                           Margin="5,0,0,0"
                           VerticalAlignment="Center" />
            </StackPanel>
        </TabItem.Header>
        Item 1
    </TabItem>
    <TabItem>
        <TabItem.Header>
            <TextBlock Text="Tab 2" />
        </TabItem.Header>
        Item 2
    </TabItem>
    <TabItem Header="Item 3">
        Item 3
    </TabItem>
</TabControl>
于 2009-07-02T19:29:04.290 回答