У вас есть несколько вариантов, представленных здесь в порядке их масштабирования.
Вариант 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>
Теперь вы можете иметь столько наборов стилей, определенных в отдельных словарях, сколько вам нужно, а затем выборочно применять их к дереву элементов.