67 votes

Styliser des éléments imbriqués dans WPF

Supposons que vous avez un élément imbriqué de la structure, 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 à la ContextMenu ou MenuItem éléments. Mais si le MenuItem style appartient au style de Menu, il est assez lourd et redondant d'ajouter à chaque MenuItem élément.

Est-il possible de les appliquer automatiquement à l'enfant-éléments? De sorte que vous pouvez simplement écrire ceci:

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

Il serait bien si FooMenuStyle pourrait de style contenant MenuItem éléments, mais cela ne semble pas être possible.

Edit: L'exemple de Menu est probablement trompeuse, car j'é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 deux solutions: l'une générale variante et un pour ItemContainerStyle et la comme:

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

167voto

Juan Calero Points 1236

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>
 

30voto

Josh G Points 7547
 <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.

5voto

Kent Boogaart Points 97432
<ContextMenu ItemContainerStyle="{StaticResource FooMenuItemStyle}">
    <MenuItem/>
</ContextMenu>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X