【问题标题】:Is it possible to set a style in XAML that selectively affects controls?是否可以在 XAML 中设置有选择地影响控件的样式?
【发布时间】:2010-10-16 05:44:38
【问题描述】:

<Window.Resources>我定义了以下样式:

    <Style x:Key="textBlockStyle" TargetType="TextBlock">
        <Setter Property="Margin" Value="5,0,5,0"/>
    </Style>

我定义了一些网格,其中有四个TextBlocks

    <WrapPanel>
        <TextBlock Style="{StaticResource textBlockStyle}">Server</TextBlock>
        <TextBlock Style="{StaticResource textBlockStyle}">IP</TextBlock>
        <TextBlock Style="{StaticResource textBlockStyle}">Port</TextBlock>
        <TextBlock Style="{StaticResource textBlockStyle}">Status</TextBlock>
    </WrapPanel>

问题:我需要引用textBlockStyle四次。

问题:是否可以在WrapPanel 或其他地方只设置一次该样式而不重复对该样式的引用?

可能是这样的:

    <WrapPanel Style="{StaticResource textBlockStyle}">
        <TextBlock>Server</TextBlock>
        <TextBlock>IP</TextBlock>
        <TextBlock>Port</TextBlock>
        <TextBlock>Status</TextBlock>
    </WrapPanel>

我不是在寻找全局解决方案!我可以删除 x:Key="textBlockStyle" 属性,但这会影响窗口中的所有 TextBlocks。我需要一个更有选择性的机制,但没有那种丑陋的代码重复。

【问题讨论】:

    标签: .net wpf xaml styles


    【解决方案1】:

    您有几个选项,这里按它们的扩展程度排列。

    选项 1:在较低级别定义不带键的样式

    您可以将资源固定在WrapPanel 级别,这样它只会影响WrapPanel 内部的控件:

    <WrapPanel>
        <WrapPanel.Resources>
            <Style TargetType="TextBlock">
                <Setter Property="Margin" Value="5,0,5,0"/>
            </Style>
        </WrapPanel.Resources>
    
        <!-- TextBlocks here -->
    </WrapPanel>
    

    请注意缺少密钥。这个Style 将适用于WrapPanel 内的所有TextBlocks。

    选项 2:使用键定义样式,然后再次在较低级别定义样式

    如果您使用密钥在较高级别定义Style,则可以在没有密钥的较低级别定义另一个Style,并将Style基于较高级别:

    <Window>
        <Window.Resources>
            <Style TargetType="TextBlock" x:Key="textBlockStyle">
                <Setter Property="Margin" Value="5,0,5,0"/>
            </Style>
        </Window.Resources>
    
        <WrapPanel>
            <WrapPanel.Resources>
                <Style TargetType="TextBlock" BasedOn="{StaticResource textBlockStyle"/>
            </WrapPanel.Resources>
    
            <!-- TextBlocks here -->
        </WrapPanel>
    </Window>
    

    这会导致Style 自动应用于WrapPanel 内部的TextBlocks,而不是外部。此外,您不会复制 Style 的详细信息 - 它们存储在更高级别。

    选项 3:将样式放在 ResourceDictionary 中并有选择地合并它

    最后,您可以将您的Styles 放在一个单独的ResourceDictionary 中,并有选择地将该字典合并到控件的Resources 集合中:

    <!-- TextBlockStyles.xaml -->
    <ResourceDictionary>
        <Style TargetType="TextBlock">
            <Setter Property="Margin" Value="5,0,5,0"/>
        </Style>
    </ResourceDictionary>
    
    <!-- Window.xaml -->
    <Window>
        <WrapPanel>
            <WrapPanel.Resources>
                <ResourceDictionary>
                    <ResourceDictionary.MergedDictionaries>
                        <ResourceDictionary Source="TextBlockStyles.xaml"/>
                    </ResourceDictionary.MergedDictionaries>
                </ResourceDictionary>
            </WrapPanel.Resources>
        </WrapPanel>
    </Window>
    
    <!-- Alternative Window.xaml if you have only one RD to merge in -->
    <Window>
        <WrapPanel>
            <WrapPanel.Resources>
                <ResourceDictionary Source="TextBlockStyles.xaml"/>
            </WrapPanel.Resources>
        </WrapPanel>
    </Window>
    

    现在您可以根据需要在单独的字典中定义任意数量的样式集,然后有选择地将它们应用到您的元素树中。

    【讨论】:

    • 如果我已经定义了样式并在其他地方使用它,我通常更喜欢选项 2,否则选项 1。对于它的价值。很好的答案肯特。
    【解决方案2】:

    是的,你可以做到。你几乎有正确的想法。你这样做是这样的......

    <WrapPanel>
    < WrapPanel. Resources >
    <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Margin" Value="5,0,5,0"/>
        </Style>
    </WrapPanel.Resources/>
            <TextBlock Server</TextBlock>
            <TextBlock >IP</TextBlock>
            <TextBlock >Port</TextBlock>
            <TextBlock >Status</TextBlock>
        </WrapPanel>
    

    通过使用 {x:type } 语法,您不需要 x:key,它将为包装面板中的所有文本块设置样式。如果您想要不同的样式,您仍然可以使用 x:key 并在文本块上明确设置样式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-20
      • 2010-11-07
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多