9

<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"属性,但这会影响Window 中的所有内容。 TextBlocks我需要一个更具选择性的机制,但没有那种丑陋的代码重复。

4

2 回答 2

17

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

选项 1:在较低级别定义没有键的样式

您可以将资源固定在该WrapPanel级别,以便它仅影响其中的控件WrapPanel

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

    <!-- TextBlocks here -->
</WrapPanel>

注意缺少密钥。这Style将适用TextBlockWrapPanel.

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

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

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

最后,您可以将您Style的 s 放在一个单独的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>

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

于 2009-03-29T15:33:12.220 回答
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 并在文本块上明确设置样式。

于 2009-03-29T15:34:44.667 回答