Стилирование вложенных элементов в WPF
Предположим, что у вас есть структура вложенных элементов, например ContextMenu с MenuItems:
<ContextMenu Style="{StaticResource FooMenuStyle}">
<MenuItem Style="{StaticResource FooMenuItemStyle}"/>
...
</ContextMenu>
Вы можете легко применять стили или шаблоны к элементам ContextMenu или MenuItem. Но если стиль MenuItem относится к стилю меню, он довольно громоздкий и избыточный, чтобы добавить его в каждый элемент MenuItem.
Есть ли способ применить их автоматически к дочерним элементам? Чтобы вы могли просто написать это:
<ContextMenu Style="{StaticResource FooMenuStyle}">
<MenuItem/>
...
</ContextMenu>
Было бы удобно, если бы FooMenuStyle мог стилизовать элементы MenuItem, но это не представляется возможным.
Изменить: пример меню, вероятно, вводит в заблуждение, поскольку я не знал о ItemContainerStyle, и цель была для общего решения. Основываясь на двух ответах, я придумал два решения: один общий вариант и один для ItemContainerStyle и т.п.:
<Style x:Key="FooMenuItem" TargetType="{x:Type MenuItem}">
...
</Style>
<Style x:Key="FooMenu" TargetType="{x:Type ContextMenu}">
<!-- Variant for specific style attribute -->
<Setter Property="ItemContainerStyle"
Value="{StaticResource FooMenuItem}"/>
<!-- General variant -->
<Style.Resources>
<Style TargetType="{x:Type MenuItem}"
BasedOn="{StaticResource FooMenuItem}"/>
</Style.Resources>
</Style>
<ContextMenu Style="{StaticResource FooMenu}">
<MenuItem/>
</ContextMenu>
Ответы
Ответ 1
<ContextMenu>
<ContextMenu.Resources>
<Style TargetType="{x:Type MenuItem}">
<!--Setters-->
</Style>
</ContextMenu.Resources>
<MenuItem/>
<!--Other MenuItems-->
</ContextMenu>
Стиль будет применяться ко всем объектам MenuItem в ContextMenu.
Ответ 2
Чтобы закончить исходный ответ, я думаю, что ясное добавление вложенного стиля внутри родительского типа:
<Style x:Key="WindowHeader" TargetType="DockPanel" >
<Setter Property="Background" Value="AntiqueWhite"></Setter>
<Style.Resources>
<Style TargetType="Image">
<Setter Property="Margin" Value="6"></Setter>
<Setter Property="Width" Value="36"></Setter>
<Setter Property="Height" Value="36"></Setter>
</Style>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap"></Setter>
</Style>
</Style.Resources>
</Style>
Ответ 3
<ContextMenu ItemContainerStyle="{StaticResource FooMenuItemStyle}">
<MenuItem/>
</ContextMenu>