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>
Foi útil?

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top