在堆栈面板中设置所有文本块的样式

39
假设我有两个不同的、独立的堆栈面板(我们称之为SPA和SPB),每个面板都有10个文本块作为子元素。SPA中的所有文本块都应使用一个样式,而SPB中的所有文本块都应使用另一个样式。实现这一点的一种方法是在资源中声明这两个样式,然后将Style="style1"附加到第一个堆栈面板中的所有10个文本块,并将Style="style2"附加到第二个堆栈面板中的所有10个文本块。但是,似乎应该有一种简单的方法将样式附加到堆栈面板本身,该方法告诉堆栈面板将其应用于所有文本块的子元素。有没有办法做到这一点?
我自然寻找这种解决方案的原因是,这正是在HTML中使用CSS进行类似操作的方式,而我希望XAML中也有类似的样式功能。
谢谢!
P.S. 我正在使用Silverlight,但我想我的情况和任何解决方案(如果有)都适用于XAML/WPF。

我猜我的情况和任何解决方案(如果有的话)都适用于XAML/WPF。这些年来你的情况怎么样了? :) - Daniel Earwicker
4个回答

65

在您的主容器的资源部分中,使用具有x:Key属性和目标类型为TextBlock的样式。然后,在每个StackPanel的资源部分中,您可以放置一个样式,其中BasedOn属性设置为您的主要样式的键(不要忘记使用StaticResource绑定,而不仅仅是键名称),然后说TargetType="{x:Type TextBlock}"并结束标签。这应该将样式带入StackPanel并为所有TextBlock提供样式。

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

太好了!我喜欢你的解决方案之处在于它实现了我的目标,同时避免了在单个资源部分中使用笨重的样式,这也使它们可以在单个堆栈面板之外的其他地方使用。谢谢! - JoeCool
上周我在解决类似问题时刚刚发现了BasedOn。你甚至可以将样式放置在ResourceDictionary中,并且只要将其包含在窗口资源中,就可以以相同的方式使用它。 - Scott M.

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

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>

0

我找到了一个好的解决方案在这里。以下是示例代码 -

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

希望这能有所帮助。


在这种情况下,样式不仅适用于StackPanel中的TextBlock,而且还适用于任何不在Stackpanel中的其他元素。 - Willy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接