【问题标题】:Set style for all textblocks in a stack panel为堆栈面板中的所有文本块设置样式
【发布时间】:2011-06-20 03:15:34
【问题描述】:

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

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

谢谢!

附:我正在使用 Silverlight,但我猜测我的情况以及任何解决方案(如果有的话)通常适用于 XAML/WPF。

【问题讨论】:

  • “我猜我的情况以及任何适用于 XAML/WPF 的解决方案(如果有的话)。”多年来,这对你有什么影响? :)

标签: wpf xaml styles


【解决方案1】:

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

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 漂亮!我喜欢您的解决方案的一点是,它实现了我的目标,同时将笨重的样式排除在各个资源部分之外,这也允许它们在单个堆栈面板之外的其他地方使用。谢谢!
    • 上周我刚刚在处理类似问题时发现了 BasedOn。您甚至可以将样式放在 ResourceDictionary 中并以相同的方式使用它,只要将其包含在窗口的资源中即可。
    【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-30
        • 2019-07-17
        • 1970-01-01
        • 2014-08-09
        相关资源
        最近更新 更多