2009-03-20 14 views
50

Angenommen, Sie eine verschachtelte Elementstruktur aufweisen, beispielsweise ein ContextMenu mit MenuItems:Styling verschachtelte Elemente in WPF

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

Schnell Arten oder Vorlagen auf die ContextMenu oder MenuItem Elemente anwenden können. Aber wenn der MenuItem-Stil zum Menü-Stil gehört, ist es ziemlich umständlich und überflüssig, ihn jedem MenuItem-Element hinzuzufügen.

Gibt es eine Möglichkeit, diese automatisch auf untergeordnete Elemente anzuwenden? Damit Sie einfach diesen schreiben können:

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

würde es ordentlich sein, wenn FooMenuStyle MenuItem Elemente enthalten Stil könnte, aber das scheint nicht möglich zu sein.

Bearbeiten: Das Menü Beispiel ist wahrscheinlich irreführend, da ich ItemContainerStyle nicht kannte und die Absicht war für eine allgemeine Lösung. eine allgemeine Variante und eine für ItemContainerStyle und dergleichen: Basierend auf den zwei Antworten, die ich habe mit beiden Lösungen kommen

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

Antwort

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

Der Stil für alle MenuItem Objekte innerhalb des ContextMenu angewendet werden.

+4

Ich glaube, er bereits einen Stil in seinen Ressourcen hat und möchte gelten es zu untergeordneten Elementen nicht erneut deklarieren. –

+0

Darüber hinaus kann es deutlicher mit dem ItemContainerStyle ausgedrückt werden. –

+0

Sie könnten einen neuen Stil deklarieren, der von einem vorherigen Stil abgeleitet wurde. –

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

Ich denke, mein Menü Beispiel war ein bisschen irreführend (da ich nicht über ItemContainerStyle wusste), und die ursprüngliche Absicht war für beliebige Elemente. Aber da ich eigentlich ein Menü habe, ist das der richtige Weg. – gix

121

Nur die ursprüngliche Antwort zu vervollständigen, ich denke, es klarer ist das verschachtelte Format innerhalb der übergeordneten wie das Hinzufügen von:

<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

Dies ist die am besten geeignete Antwort. Nein, wo im Web kann man gut. Du schaukelst! Vielen Dank. – Rohit

+2

Danke, diese Information ist wirklich schwer zu finden. –

+0

Ich habe dieses Beispiel verwendet, um mir zu helfen, einen Stil auf alle Textblöcke anzuwenden, die in einem Tooltip verschachtelt sind - setze eine maximale Breite und erzwinge den Umbruch, so dass lange Nachrichten besser formatiert sind. – sfuqua