web-dev-qa-db-fra.com

Styliser des éléments imbriqués dans WPF

Supposons que vous ayez une structure d'élément imbriquée, par exemple un ContextMenu avec MenuItems:

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

Vous pouvez facilement appliquer des styles ou des modèles aux éléments ContextMenu ou MenuItem. Mais si le style MenuItem appartient au style Menu, il est assez lourd et redondant de l'ajouter à chaque élément MenuItem.

Existe-t-il un moyen de les appliquer automatiquement aux éléments enfants? Pour que vous puissiez simplement écrire ceci:

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

Ce serait bien si FooMenuStyle pouvait styliser contenant des éléments MenuItem, mais cela ne semble pas être possible.

Edit: l'exemple de menu est probablement trompeur car je n'étais pas au courant de ItemContainerStyle et l'intention était pour une solution générale. Sur la base des deux réponses, j'ai trouvé deux solutions: une variante générale et une pour ItemContainerStyle et similaires:

<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>
58
gix
<ContextMenu>
   <ContextMenu.Resources>
      <Style TargetType="{x:Type MenuItem}">
         <!--Setters-->
      </Style>
   </ContextMenu.Resources>
   <MenuItem/>
   <!--Other MenuItems-->
</ContextMenu>

Le style sera appliqué à tous les objets MenuItem dans le ContextMenu.

21
Josh G

Juste pour compléter la réponse originale, je pense qu'il est plus clair d'ajouter le style imbriqué à l'intérieur du parent comme ça:

<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>
135
Juan Calero
<ContextMenu ItemContainerStyle="{StaticResource FooMenuItemStyle}">
    <MenuItem/>
</ContextMenu>
5
Kent Boogaart