首页 文章

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

提问于
浏览
37

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

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

谢谢!

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

4 回答

  • 59

    在主容器的资源部分中,将样式设置为 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>
    
  • 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>
    
  • 0

    您可以通过覆盖每个堆栈面板的Resources中的默认文本块样式来完成此操作:

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

    我找到了一个很好的解决方案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>
    

    我希望这会有所帮助 .

相关问题