Denominar elementos aninhados no WPF
Pergunta
Suponha que você tenha uma estrutura de elemento aninhado, por exemplo, um ContextMenu com MenuItems:
<ContextMenu Style="{StaticResource FooMenuStyle}">
<MenuItem Style="{StaticResource FooMenuItemStyle}"/>
...
</ContextMenu>
Você pode facilmente aplicar estilos ou modelos para os elementos ContextMenu ou MenuItem. Mas se o estilo MenuItem pertence ao estilo de menu é bastante complicado e redundante para adicioná-lo a cada elemento MenuItem.
Existe alguma maneira de aplicar os automaticamente para elementos filhos? De modo que você pode simplesmente escrever isso:
<ContextMenu Style="{StaticResource FooMenuStyle}">
<MenuItem/>
...
</ContextMenu>
Seria legal se FooMenuStyle poderia estilo contendo elementos MenuItem, mas isso não parece ser possível.
Edit: O exemplo de menu é provavelmente enganoso já que eu não tinha conhecimento de ItemContainerStyle ea intenção era para uma solução geral. Com base nas duas respostas que eu vim com duas soluções: uma variante geral e uma para ItemContainerStyle e similares:
<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>
Solução
<ContextMenu>
<ContextMenu.Resources>
<Style TargetType="{x:Type MenuItem}">
<!--Setters-->
</Style>
</ContextMenu.Resources>
<MenuItem/>
<!--Other MenuItems-->
</ContextMenu>
O estilo será aplicado a todos os MenuItem objetos dentro do ContextMenu.
Outras dicas
Apenas para completar a resposta original, eu acho que é mais clara adicionando o estilo aninhado no interior do pai assim:
<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>
<ContextMenu ItemContainerStyle="{StaticResource FooMenuItemStyle}">
<MenuItem/>
</ContextMenu>