在<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
。我需要一个更具选择性的机制,但没有那么难看的代码重复。
答案 0 :(得分: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
将适用于TextBlock
中的所有WrapPanel
。
选项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
自动应用于TextBlock
内的WrapPanel
,但不在其外部。此外,您不会复制Style
的详细信息 - 它们存储在更高级别。
选项3:将样式放在ResourceDictionary中并有选择地合并
最后,您可以将Style
放在单独的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>
现在,您可以根据需要在单独的词典中定义任意数量的样式集,然后有选择地将它们应用于元素树。
答案 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,它将为wrappanel中的所有文本块设置样式。如果你想要diff样式,你仍然可以使用x:key和explicity在textblock上设置样式。