Supponiamo di avere una struttura di elemento nidificato, ad esempio, un ContextMenu con MenuItems:Styling elementi annidati in WPF
<ContextMenu Style="{StaticResource FooMenuStyle}">
<MenuItem Style="{StaticResource FooMenuItemStyle}"/>
...
</ContextMenu>
Si può facilmente applicare stili o modelli agli elementi ContextMenu o MenuItem. Ma se lo stile MenuItem appartiene allo stile Menu è piuttosto ingombrante e ridondante per aggiungerlo a ogni elemento MenuItem.
C'è un modo per applicarli automaticamente agli elementi figlio? In modo che si può semplicemente scrivere questo:
<ContextMenu Style="{StaticResource FooMenuStyle}">
<MenuItem/>
...
</ContextMenu>
Sarebbe pulito se FooMenuStyle potesse lo stile contenente elementi MenuItem, ma che non sembra essere possibile.
Modifica: L'esempio di menu è probabilmente fuorviante poiché non ero a conoscenza di ItemContainerStyle e l'intento era per una soluzione generale. Sulla base delle due risposte sono venuto su con due soluzioni: una variante generale e uno per ItemContainerStyle e simili:
<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>
Credo che abbia già uno stile nelle sue risorse e vorrei applicare a oggetti figlio, non re-dichiararlo di nuovo. –
Inoltre, può essere espresso più chiaramente utilizzando ItemContainerStyle. –
È possibile dichiarare un nuovo stile derivato da uno stile precedente. –