2009-03-20 9 views
50

Suponga que tiene una estructura de elemento anidado, por ejemplo, un ContextMenu con MenuItems:Styling elementos anidados en WPF

<ContextMenu Style="{StaticResource FooMenuStyle}"> 
    <MenuItem Style="{StaticResource FooMenuItemStyle}"/> 
    ... 
</ContextMenu> 

Usted puede aplicar fácilmente estilos o plantillas para los elementos ContextMenu o MenuItem. Pero si el estilo de MenuItem pertenece al estilo de menú, es bastante engorroso y redundante agregarlo a cada elemento de MenuItem.

¿Hay alguna forma de aplicar esos automáticamente a los elementos secundarios? Por lo que sólo tiene que escribir esto:

<ContextMenu Style="{StaticResource FooMenuStyle}"> 
    <MenuItem/> 
    ... 
</ContextMenu> 

Sería interesante si podía FooMenuStyle estilo contiene elementos MenuItem, pero eso no parece ser posible.

Editar: El ejemplo de menú probablemente sea engañoso ya que no conocía ItemContainerStyle y la intención era una solución general. Sobre la base de las dos respuestas que he llegado con dos soluciones: una variante en general y uno para ItemContainerStyle y 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> 

Respuesta

17
<ContextMenu> 
    <ContextMenu.Resources> 
     <Style TargetType="{x:Type MenuItem}"> 
     <!--Setters--> 
     </Style> 
    </ContextMenu.Resources> 
    <MenuItem/> 
    <!--Other MenuItems--> 
</ContextMenu> 

El estilo que se aplicará a todos los objetos MenuItem dentro del ContextMenu.

+4

creo que ya tiene un estilo en sus recursos y quisiera aplicar a artículos para niños, no volver a declararlo de nuevo. –

+0

Además, se puede expresar más claramente mediante el uso del ItemContainerStyle. –

+0

Puede declarar un nuevo estilo derivado de un estilo anterior. –

6
<ContextMenu ItemContainerStyle="{StaticResource FooMenuItemStyle}"> 
    <MenuItem/> 
</ContextMenu> 
+0

Creo que mi ejemplo de menú fue un poco engañoso (ya que no sabía sobre ItemContainerStyle), y el intento inicial fue para elementos arbitrarios. Pero como tengo un menú, este es el camino a seguir. – gix

121

Sólo para completar la respuesta original, creo que es la adición más claro el estilo anidado dentro de la matriz así:

<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> 
+6

Esta es la respuesta más adecuada. No en la web uno puede estar bien. ¡Rock! Gracias. – Rohit

+2

Gracias, esta información es realmente difícil de encontrar. –

+0

Utilicé este ejemplo para ayudarme a aplicar un estilo a todos los bloques de texto anidados en una información sobre herramientas, estableciendo un ancho máximo y aplicando el ajuste para que los mensajes largos estén mejor formateados. – sfuqua