【问题标题】:Stop child from inheriting parent Style in TabControls阻止子继承 TabControls 中的父样式
【发布时间】:2016-10-30 23:10:52
【问题描述】:

在我的 WPF 应用程序中,我有一个 TabControl,我将其绑定到我创建的样式:

在我看来:

<TabControl Grid.Row="6" Style="{DynamicResource SideBarTabControl}">

在单独的资源字典上:

<Style x:Key="SideBarTabControl" TargetType="{x:Type TabControl}" BasedOn="{StaticResource {x:Type TabControl}}" >
        <Setter Property="FontSize" Value="{DynamicResource TitleFontSize}"/>
</Style>

到目前为止一切顺利,一切正常。问题是现在这个 TabControl 的所有子项,例如 TabItem 中的 ListView,也获得了与 TabControl 相同的 FontSize,而不是默认值。

我认为通过指定 TargetType="{x:Type TabControl}" 我会阻止将样式应用于不同类型的子项。我正在寻找的是真正阻止它影响一切,但明确继承该样式的组件。那么如何做到这一点呢?我想我错过了一些简单的东西......

如果我在我的 ListView 中覆盖字体大小,它可以工作,但这意味着我必须为每个孩子都这样做,这可能会变得非常麻烦。

我已阅读此问题和其他问题,但找不到我正在寻找的答案:

Is it possible to set a style in XAML that selectively affects controls?

【问题讨论】:

  • 您不能将 TabControl 样式应用于 TabItem。 XAML 中的样式与 CSS 非常不同。它们确实继承了父级的 TextElement.FontSize,但不是通过您建议的机制。但这有点 OT —— 你想要做的是设置 TabItems 本身的样式,并明确地为它们指定你希望它们使用的任何字体大小。
  • 这里是如何设置 TabItem 样式:stackoverflow.com/a/4693910/424129
  • 也许我没有很好地解释自己。我正在设置 TabControl 的样式,增加选项卡中的字体大小,并最终增加背景颜色,这很有效。但它也会影响 TabItems 内的组件。我想阻止样式向下层叠
  • 如果要更改 TabItems 的外观,请设置 TabItems 的样式。
  • 如果是这种情况,您的 Style 需要以 TabItem 为目标,并且您将设置 HeaderTemplate 的模板,如图所示 here

标签: wpf xaml


【解决方案1】:

这对我有用。做这项工作的部分是TabControl.ItemContainerStyle。它仅将字体大小应用于标题内容。

<TabControl>
    <TabControl.ItemContainerStyle>
        <Style 
            TargetType="TabItem" 
            BasedOn="{StaticResource {x:Type TabItem}}"
            >
            <Setter Property="HeaderTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <ContentControl 
                            TextElement.FontSize="20" 
                            Content="{Binding Header, RelativeSource={RelativeSource AncestorType=TabItem}}" 
                            />
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </TabControl.ItemContainerStyle>
    <TabItem Header="Foo">
        <Label Content="Bar" />
    </TabItem>
    <TabItem Header="Baz">
        <Label Content="Bar" />
    </TabItem>
</TabControl>

【讨论】:

  • 有效!再次感谢埃德。我什至将 Style 移到了我的 ResourceDictionary,所以一切都很整洁。我猜这个问题会再次出现在其他对象类型中,所以我会研究这个解决方案并了解更多关于 DataTemplates 的信息。
【解决方案2】:

你无法阻止它,你想要摆脱的不是导致这种不需要的涓滴效应的风格;这就是 WPF 控件的工作方式。

您必须做的是为您的选项卡项编写另一种样式,以拦截从 TabControl 继承的样式。 我建议在现有的 TabControl 样式中编写此样式,在 Style.Resources 标记中,如下所示:

 <Style x:Key="SideBarTabControl" TargetType="{x:Type TabControl}" BasedOn="{StaticResource {x:Type TabControl}}" >
                <Style.Resources>
                    <Style TargetType="{x:Type TabItem}">
                        <Setter Property="FontSize" Value="9001"/>
                        <!-- Any other setters you want for TabItems -->
                    </Style>
                </Style.Resources>
                <Setter Property="FontSize" Value="{DynamicResource TitleFontSize}"/>
            </Style>

通过在其他样式的资源中创建样式,它将被携带,并且不为TabItem 样式指定任何x:Key - 它会将其应用于任何未排序的TabItem样式,现在成为您在 TabControl 中创建的任何 TabItem 的默认样式。

【讨论】:

  • 这将适用于 TabItem 中所有内容的字体大小,OP 仅指定 Headers 对吗?
  • 试过了,看起来像@ChrisW。是对的。 OP 必须为选项卡页的内容显式设置 TextElement.FontSize,或者为选项卡标题内容显式设置它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2011-02-07
  • 2013-08-19
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多