【问题标题】:Trigger for TabItem.IsSelected doesn't workTabItem.IsSelected 的触发器不起作用
【发布时间】:2016-05-08 14:17:54
【问题描述】:

我想将选中的标签背景设置为红色,未选中的设置为绿色。但是,只有未选中的选项卡在更改时显示为绿色。所选内容保持白色。

        <TabControl Background="LightGray" Name="MainTabControl">
        <TabControl.Resources>
            <Style TargetType="TabItem">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="Red" />
                    </Trigger>
                    <Trigger Property="IsSelected" Value="False">
                        <Setter Property="Background" Value="Green" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TabControl.Resources>
        <TabItem Header="Main" />
        <TabItem Header="Optimizer" />
    </TabControl>

【问题讨论】:

    标签: wpf styles selecteditem


    【解决方案1】:

    覆盖TabItemControlTemplate 并向其添加触发器

    <Style TargetType="{x:Type TabItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TabItem}">
                        <Grid>
                            <Border Name="Border"  >
                                <ContentPresenter  VerticalAlignment="Center" Margin="5"
                              HorizontalAlignment="Center"
                              ContentSource="Header" >                                   
                                </ContentPresenter>
                            </Border>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="True">                                
                                <Setter TargetName="Border" Property="Background" Value="Red" />                                
                            </Trigger>
                            <Trigger Property="IsSelected" Value="False">
                                <Setter TargetName="Border" Property="Background" Value="Green" />                                                                
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    

    编辑

    要保留原始tabitem 样式并添加背景颜色,请从vs 设计器中右键单击tabitem 并选择EditTemplate > Edit a Copy,然后更新负责未选中的TabItem.Static.Background Gardian 画笔tab 颜色,TabItem.Selected.Background Brush 负责 Selected tab 颜色:

      //..
      <LinearGradientBrush x:Key="TabItem.Static.Background" EndPoint="0,1" StartPoint="0,0">
            <GradientStop Color="#F0F0F0" Offset="0.0"/>
            <GradientStop Color="Green" Offset="1.0"/>
        </LinearGradientBrush>
        <SolidColorBrush x:Key="TabItem.Static.Border" Color="#ACACAC"/>
        <LinearGradientBrush x:Key="TabItem.MouseOver.Background" EndPoint="0,1" StartPoint="0,0">
            <GradientStop Color="#ECF4FC" Offset="0.0"/>
            <GradientStop Color="#DCECFC" Offset="1.0"/>
        </LinearGradientBrush>
        <SolidColorBrush x:Key="TabItem.MouseOver.Border" Color="#7EB4EA"/>
        <SolidColorBrush x:Key="TabItem.Disabled.Background" Color="#F0F0F0"/>
        <SolidColorBrush x:Key="TabItem.Disabled.Border" Color="#D9D9D9"/>
        <SolidColorBrush x:Key="TabItem.Selected.Border" Color="#ACACAC"/>
        <SolidColorBrush x:Key="TabItem.Selected.Background" Color="Red"/>
        //..
    

    或者

    或者您可以在mainBorderinnerBorder 中使用templateBindingBackground 属性(最初只有mainBordertemplateBindedbackground 属性),然后添加您的触发器到controlTemplate 触发器,

    <Grid x:Name="templateRoot" SnapsToDevicePixels="true">
                            <Border x:Name="mainBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,1,1,0" Background="{TemplateBinding Background}" Margin="0">
                                <Border x:Name="innerBorder" BorderBrush="{StaticResource TabItem.Selected.Border}" BorderThickness="1,1,1,0"  Background="{TemplateBinding Background}" Margin="-1" Opacity="0"/>
                            </Border>
                            <ContentPresenter x:Name="contentPresenter" ContentSource="Header" Focusable="False" HorizontalAlignment="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
                        </Grid>
    

    并在最后添加您的触发器

                  <Trigger Property="IsSelected" Value="True">
                                    <Setter Property="Background" Value="Red" />
                                </Trigger>
                                <Trigger Property="IsSelected" Value="False">
                                    <Setter Property="Background" Value="Green" />
                                </Trigger>
    
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
    

    那应该回答你的第二个问题

    【讨论】:

    • 非常感谢。我有更多的问题: 1. 如果我想保持默认的 TabItem 样式怎么办?目前颜色工作正常,但布局看起来与原来的有点不同。 2、我的代码不起作用是什么原因?
    • 如果您不想保留原始 tabItem 样式并仅根据“IsSelectedPrperty”更改背景,则需要使用 Blend 编辑 tabItem 模板,或者只需从 Visual Studio 设计器中单击 EditTemplate>编辑副本并在生成的样式中更改生成样式的背景颜色
    • 您的原始代码不起作用的事实可能是由于选择项目时 TabItem 面板没有模板绑定到 Background 属性,您可以通过简单地检查 Generated TabItem controlTemplate 以及触发器如何管理选定的选项卡
    • 了解问题的原因以及解决方案如何解决这些问题会很有趣,否则这往往会鼓励voodoo programming
    • 请查看上面的 cmets,il n'y a ni de voodoo ni de doodoo!
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 2016-01-02
    • 2018-10-17
    • 2017-04-22
    • 2011-03-16
    • 2019-01-17
    • 2012-09-04
    相关资源
    最近更新 更多