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

Joe*_*ool 36 wpf xaml styles

假设我有两个不同的,不同的堆栈面板(我们称之为SPA和SPB),每个面板都有10个文本块作为子元素.SPA中的所有文本块都应使用一种样式,SPB中的所有文本块都应使用另一种样式.实现此目的的一种方法是在参考资料中声明两个样式,然后附加Style="style1"到第一个堆栈面板中的所有10个文本块,并附Style="style2"加到第二个中的所有10个文本块.但是,似乎应该有一些简单的方法将样式附加到stackpanel本身,以某种方式告诉stackpanel将它应用于所有子文本块的子元素.反正有没有这样做?

我自然而然地寻找这个解决方案的原因是因为这正是你用CSS在HTML中做同样的事情,我希望XAML会有类似的功能.

谢谢!

PS我正在使用Silverlight,但我猜我的情况和任何解决方案(如果有的话)一般都适用于XAML/WPF.

Sco*_* M. 61

在主容器的资源部分中,为您的样式添加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>
Run Code Online (Sandbox Code Playgroud)


dec*_*one 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>
Run Code Online (Sandbox Code Playgroud)