WPF TabControl 在 TabItem 样式中应用重写它(使用 ItemSource 时)



我有一个具有自定义 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 采用 TabItem 的默认窗口样式。是否可以应用自定义选项卡项而不是覆盖它并使用项源?

您可以通过嵌套TabControlStyle 属性指定样式:

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

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

更新

我假设您正在对选项卡项使用所谓的隐式样式,该样式在顶级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>

若要避免取消嵌套选项卡控件的样式,请参阅 AnjumSKhan 的答案,该答案将外部控件的样式放在触发器中,该触发器的绑定巧妙地仅针对一个控件:

<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>

相关内容

  • 没有找到相关文章

最新更新