Стиль вложенных элементов в WPF
предположим, что у вас есть вложенная структура элементов, например ContextMenu с MenuItems:
<ContextMenu Style="{StaticResource FooMenuStyle}">
<MenuItem Style="{StaticResource FooMenuItemStyle}"/>
...
</ContextMenu>
вы можете легко применять стили или шаблоны к элементам ContextMenu или MenuItem. Но если стиль MenuItem принадлежит стилю меню, то довольно громоздко и избыточно добавлять его к каждому элементу MenuItem.
есть ли способ применить их автоматически к дочерним элементам? Так что вы можете просто написать это:
<ContextMenu Style="{StaticResource FooMenuStyle}">
<MenuItem/>
...
</ContextMenu>
было бы аккуратно, если FooMenuStyle может содержать элементы MenuItem, но это, похоже, невозможно.
Edit: пример меню, вероятно, вводит в заблуждение, так как я не знал о 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>
3 ответов:
<ContextMenu> <ContextMenu.Resources> <Style TargetType="{x:Type MenuItem}"> <!--Setters--> </Style> </ContextMenu.Resources> <MenuItem/> <!--Other MenuItems--> </ContextMenu>стиль будет применен ко всем объектам MenuItem в пределах ContextMenu.
просто для завершения исходного ответа, я думаю, что это яснее, добавив вложенный стиль внутри родителя, как это:
<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>
Comments