我有一些StackPanels我希望有相同的宽度。然而,这不应该影响所有的stackpanel和我不想子类只是为了这个。我知道以下是可能的:
<Style BasedOn="{StaticResource {x:Type TextBlock}}"
TargetType="TextBlock"
x:Key="TitleText">
<Setter Property="FontSize" Value="26"/>
</Style>
...
<TextBlock Style="{StaticResource TitleText}">
Some Text
</TextBlock>
但是有没有一种方法可以让TextBlock不知道它的样式(就像当HTML与应用于元素的CSS规则是分开的)?
我只是想给所有相关的stackpanel相同的类id,然后应用
不幸的是,这在WPF中是不可能的。最接近于此的是您在示例中所演示的。
然而,如果你想在相同的根容器中对所有 StackPanels应用样式,你可以将style指定为根容器的资源,而不使用x:Key
属性。例如:
<Grid x:Name="LayoutRoot">
<Grid x:Name="StackPanelsRoot">
<Grid.Resources>
<Style TargetType="StackPanel">
...
</Style>
</Grid.Resources>
<StackPanel x:Name="SP1" ... />
<StackPanel x:Name="SP2" ... />
...
</Grid>
<StackPanel x:Name="SP3" ... />
...
</Grid>
这里,样式将应用于SP1
和SP2
,但不应用于SP3
TargetType将自动为该类型的所有对象设置Style。如果你想让一个特定的TextBlock选择退出样式,你可以这样做:
<TextBlock Style="{x:Null}"></TextBlock>
遗憾的是没有,但是您可以创建一个附加属性来设置一个类,然后隐式地将样式应用于所有文本块,但在该附加属性上使用Triggers
来决定应用哪些设置器。这样做的缺点是,它仍然不是很好,而且样式的功能也受到限制,因为您不能在子样式中使用触发器。