【问题标题】:WPF TabControl apply TabItem style insead of overriding it (while using ItemSource)WPF TabControl 应用 TabItem 样式而不是覆盖它(使用 ItemSsource 时)
【发布时间】:2014-11-26 08:50:25
【问题描述】:

我有一个带有自定义 TabItem 样式的父 TabControl:

<TabControl ItemsSource="{Binding TabViewModels}" SelectedIndex="0" Padding="0,0,0,0" BorderThickness="0,0,0,0" Panel.ZIndex="1">

    <TabControl.Resources>

        <Style TargetType="{x:Type TabItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TabItem}" >

                        <Border Name="Border" CornerRadius="6,6,0,0" Margin="0,0,2,2">
                            <ContentPresenter TextBlock.TextAlignment="Center" TextBlock.FontSize="14"
                                        Height="40" Width="auto" Content="{Binding Path=TabName}" Margin="12,2,12,2"/>
                        </Border>

                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="True">
                                <Setter TargetName="Border" Property="Background" Value="#00B6FA" />
                            </Trigger>
                            <Trigger Property="IsSelected" Value="False">
                                <Setter TargetName="Border" Property="Background" Value="LightGray" />
                            </Trigger>
                        </ControlTemplate.Triggers>

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

        <Style TargetType="TabPanel">
            <Setter Property="HorizontalAlignment" Value="Right"/>
        </Style>

    </TabControl.Resources>

    <TabControl.ContentTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding Path=. }"/>
        </DataTemplate>
    </TabControl.ContentTemplate>

</TabControl>

在父 TabControl 的其中一个选项卡中,我有一个子 TabControl。 问题是子 TabControl 自动采用自定义 TabItem 样式,因为如您在上面看到的那样,我覆盖了它。我想要的是子 TabControl 采用 TabItems 的默认窗口样式。 这是否可以应用自定义选项卡项而不是覆盖它并使用 ItemSource?

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    您可以通过Style 属性为嵌套的TabControl 指定样式:

    <TabControl Style="{DynamicResource ResourceKey={x:Type TabControl}}">
        ...
    </TabControl>
    

    默认样式键通常是控件的类型,因此是{x:Type TabControl}

    更新

    我假设您使用所谓的 implicit style 选项卡项目,这是在顶级 TabControl 的资源字典中定义的。 隐式风格 我理解一种没有键且指定了TargetType 的风格。要将默认样式应用于特定嵌套 TabControl 中的 TabItem 控件,只需将空的隐式样式添加到其资源字典中,如下所示:

    <TabControl x:Name="OuterTabControl">
        <TabControl.Resources>
            <Style TargetType="TabItem">
                <!-- your style definition -->
            </Style>
        </TabControl.Resources>
        ...
            <TabControl x:Name="InnerTabControl">
                <TabControl.Resources>
                    <Style TargetType="TabItem"/>
                </TabControl.Resources>
            </TabControl>
        ...
    </TabControl>
    

    【讨论】:

    • 我编辑了我的问题,因为它不是关于 TabControl 样式,而是关于 TabItem 样式。我已经尝试过您的解决方案,但它似乎不起作用,因为我在父选项卡项的资源中覆盖了 {x:Type TabItem}。是否有另一种方法可以应用自定义 TabItem 样式而不覆盖它?
    • 您是在 XAML 中手动添加选项卡项还是使用TabControl.ItemsSource
    【解决方案2】:

    为避免嵌套选项卡控件的样式不固定,请参阅 AnjumSKhan 的 answer,它将外部控件的样式放在触发器中,其绑定巧妙地仅针对一个控件:

    <TabControl.Resources>
        <Style TargetType="TabItem">
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=TabControl, AncestorLevel=2}}" Value="{x:Null}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="TabItem">
                                <Border Name="Border" Background="Red">
                                    <ContentPresenter ContentSource="Header"/>
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>                    
        </Style> </TabControl.Resources>
    

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 1970-01-01
      • 2011-03-31
      • 2012-02-18
      • 2011-01-24
      • 2013-03-12
      • 1970-01-01
      • 2019-04-17
      • 2012-11-17
      相关资源
      最近更新 更多