【发布时间】:2011-06-17 14:50:13
【问题描述】:
我正在尝试为 TabItem 标头制作自定义样式。我无意中让它工作了。
这失败了:
<Style TargetType="{x:Type TabItem}" x:Name="TabHeader3" x:Key="test">
但是这行得通
<Style TargetType="{x:Type TabItem}" x:Name="TabHeader3">
发生了什么事?
【问题讨论】:
我正在尝试为 TabItem 标头制作自定义样式。我无意中让它工作了。
这失败了:
<Style TargetType="{x:Type TabItem}" x:Name="TabHeader3" x:Key="test">
但是这行得通
<Style TargetType="{x:Type TabItem}" x:Name="TabHeader3">
发生了什么事?
【问题讨论】:
您定义的第一个样式是“显式”样式,因此您必须像这样显式使用它:
<TabItem Style="{StaticResource test}" />
您定义的第二个样式是“隐式”样式。因此,它将应用于视觉/逻辑树中其下方的所有 TabItem 控件,或者如果它在应用程序资源中定义,则应用于所有 TabItem 控件。
你的第二个 Style 相当于:
<Style TargetType="{x:Type TabItem}" x:Name="TabHeader3" x:Key="{x:Type TabItem}">
所以关键是它应该应用到的对象的类型。
如果 TabItem 有明确定义的样式(如我上面所示),则不会使用任何隐式样式。此外,如果您定义了两个隐式样式,则最接近的一个获胜。所以在这里:
<Window>
<Window.Resources>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Background" Value="Red" />
</Style>
</Window.Resources>
<Grid>
<Grid.Resources>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Background" Value="Blue" />
</Style>
</Grid.Resources>
...
<TabItem ... />
...
</Grid>
</Window>
蓝色样式将优先于红色样式。
最后,您通常不需要在样式中包含x:Name。
【讨论】:
如果您在没有键的情况下将样式添加到资源字典,则默认情况下该样式将应用于资源字典范围内的所有 TabItem。如果为样式添加 Key,则需要手动设置样式
【讨论】: