假设我有两个不同的,不同的堆栈面板(我们称之为SPA和SPB),每个面板都有10个文本块作为子元素。 SPA中的所有文本块都应使用一种样式,SPB中的所有文本块都应使用另一种样式。实现此目的的一种方法是在参考资料中声明两个样式,然后将Style="style1"
附加到第一个堆栈面板中的所有10个文本块,并将Style="style2"
附加到第二个中的所有10个文本块。但是,似乎应该有一些简单的方法将样式附加到stackpanel本身,以某种方式告诉stackpanel将它应用于所有子文本块的子元素。反正有吗?
我自然而然地寻找这个解决方案的原因是因为这正是你在用CSS做HTML的同样的事情,我希望XAML会有类似的功能。
谢谢!
P.S。我正在使用Silverlight,但我猜我的情况和任何解决方案(如果有的话)一般适用于XAML / WPF。
答案 0 :(得分:58)
在主容器的资源部分中,使用x:Key
属性和目标类型TextBlock
设置样式。然后在每个StackPanel
的每个资源部分中,您可以将BasedOn
属性设置为主样式的键的样式(不要忘记使用StaticResource绑定,而不仅仅是键)然后说TargetType="{x:Type TextBlock}"
并结束标记。这应该将样式带入StackPanel并设置所有TextBlocks的样式。
<Window ...>
<Window.Resources>
<Style x:Key="tbstyle" TargetType="{x:Type TextBlock}">
<!-- put setters here -->
</Style>
</Window.Resources>
<StackPanel name="SPA">
<StackPanel.Resources>
<Style BasedOn="{StaticResource tbstyle}" TargetType="{x:Type TextBlock}" />
</StackPanel.Resources>
<TextBlock ... />
<TextBlock ... />
<TextBlock ... />
<TextBlock ... />
<TextBlock ... />
</Stackpanel>
<StackPanel name="SPB">
<StackPanel.Resources>
<Style BasedOn="{StaticResource tbstyle}" TargetType="{x:Type TextBlock}" />
</StackPanel.Resources>
<TextBlock ... />
<TextBlock ... />
<TextBlock ... />
<TextBlock ... />
<TextBlock ... />
</StackPanel>
</Window>
答案 1 :(得分:14)
<StackPanel>
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Margin"
Value="5" />
</Style>
</StackPanel.Resources>
<TextBlock Text="Text" />
<TextBlock Text="Text" />
<TextBlock Text="Text" />
<TextBlock Text="Text" />
</StackPanel>
答案 2 :(得分:4)
您可以通过覆盖每个堆栈面板的参考资料中的默认文本块样式来实现此目的:
<StackPanel>
<StackPanel.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Background"
Value="Red"/>
</Style>
</StackPanel.Resources>
<TextBlock .../>
<TextBlock .../>
<TextBlock .../>
<TextBlock .../>
</StackPanel>
<StackPanel>
<StackPanel.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Background"
Value="Green"/>
</Style>
</StackPanel.Resources>
<TextBlock .../>
<TextBlock .../>
<TextBlock .../>
<TextBlock .../>
</StackPanel>
答案 3 :(得分:0)
我为此找到了一个不错的解决方案here。下面是示例代码-
<Window x:Class="WpfTutorialSamples.Styles.WindowWideStyleSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WindowWideStyleSample" Height="200" Width="300">
<Window.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Gray" />
<Setter Property="FontSize" Value="24" />
</Style>
</Window.Resources>
<StackPanel Margin="10">
<TextBlock>Header 1</TextBlock>
<TextBlock>Header 2</TextBlock>
<TextBlock Foreground="Blue">Header 3</TextBlock>
</StackPanel>
我希望这会有所帮助。