Question

J'aimerais créer des MenuHeaders personnalisés dans WPF afin de pouvoir avoir (par exemple) une icône et du texte dans un élément de menu.

Normalement, en utilisant MenuItems, si vous remplissez le champ En-tête avec du texte simple, vous pouvez ajouter un accélérateur en utilisant un trait de soulignement.par exemple, _Fichier

Cependant, si je voulais installer un UserControl, je pense que cette fonction serait interrompue, comment ferais-je quelque chose de similaire à ce qui suit ?

<Menu>
<MenuItem>
    <MenuItem.Header>
    <UserControl>
        <Image Source="..." />
        <Label Text="_Open" />
    </UserControl>
    </MenuItem.Header>
</MenuItem>
...
Était-ce utile?

La solution

Je pense que la propriété Icon répond à vos besoins.
Cependant pour répondre à la question initiale, il est possible de conserver la fonctionnalité Accélérateur lorsque vous composez le contenu de votre élément de menu. Si vous avez du contenu imbriqué dans un MenuItem, vous devez définir explicitement la propriété AccessText comme dans le premier ci-dessous.Lorsque vous utilisez le formulaire en ligne, cela est automatiquement pris en charge.

 <Menu> 
   <MenuItem>
      <MenuItem.Header>
        <StackPanel Orientation="Horizontal">
          <Image Source="Images/Open.ico" />      
          <AccessText>_Open..</AccessText>
        </StackPanel>
      </MenuItem.Header>
    </MenuItem>
    <MenuItem Header="_Close" />
   </Menu>

Autres conseils

Le problème est que vous avez placé l'image à l'intérieur du contenu du MenuHeader, ce qui signifie que vous perdrez la touche accélérateur.Si vous essayez simplement d'avoir une image dans l'en-tête du menu, procédez comme suit.

<MenuItem Header="_Open">
  <MenuItem.Icon>
    <Image Source="images/Open.png"/>
  </MenuItem.Icon>
</MenuItem>

Si vous souhaitez personnaliser encore plus l'apparence, modifiez le modèle de contrôle et le style du menu.Par expérience, le style des menus et des éléments de menu est beaucoup plus difficile que le style des autres contrôles WPF.

À première vue, on pourrait penser que la propriété Icon ne peut contenir qu’une image.Mais il peut en réalité contenir n’importe quoi !J'ai découvert cela par accident lorsque j'ai essayé par programme de définir la propriété Image directement sur une chaîne avec le chemin d'accès à une image.Le résultat était qu’il n’affichait pas l’image, mais le texte même du chemin !Ensuite, j'ai découvert que je devais d'abord créer un élément Image et le définir sur la propriété Icon.Cela m'a amené à penser que la propriété Image était n'importe quel conteneur de contenu situé dans la zone d'icônes à gauche dans le menu, et j'avais raison.J'ai essayé d'y mettre un bouton, et ça a marché !

Ceci affiche un bouton avec le texte "i" dans la zone Icône de l'élément de menu.Lorsque vous cliquez sur le bouton, l'événement Button_Click est déclenché (le LanguageMenu_Click n'est PAS déclenché lorsque vous cliquez sur le bouton).

<MenuItem Name="LanguageMenu" Header="_Language" Click="LanguageMenu_Click">
  <MenuItem.Icon>
    <Button Click="Button_Click">i</Button>
  </MenuItem.Icon>
</MenuItem>

Cela conduit à une alternative consistant à ne pas avoir à créer d'image pour l'icône, mais à utiliser du texte avec une police de symbole pour afficher une simple "icône".L'exemple suivant utilise la police Wingdings qui contient un symbole de disquette.Ce symbole dans la police est mappé au caractère <, qui a une signification particulière en XAML, nous devons donc utiliser la version codée &lt; plutôt.Cela fonctionne comme un rêve !Ce qui suit montre un symbole de disquette sous forme d'icône sur l'élément de menu :

<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save">
  <MenuItem.Icon>
    <Label VerticalAlignment="Center" HorizontalAlignment="Center" 
           FontFamily="Wingdings">&lt;</Label>
  </MenuItem.Icon>                
</MenuItem>

@a7an :Ah, je n'avais pas remarqué la propriété Icon auparavant.C'est un bon début.

Cependant, je souhaitais spécifiquement ajouter un « bouton » supplémentaire à certains éléments de menu afin de pouvoir disposer d'une fonctionnalité « Épingler » (voir la liste des documents récemment chargés dans Office 2007 pour l'idée de la fonctionnalité).

Puisqu'il doit également y avoir du code, devrai-je probablement sous-classer le contrôle et ajouter le code pour le bouton ?(Je n'ai pas peur de jouer avec le modèle MenuItem, j'ai déjà dû le faire une fois et je le referais si je devais le faire !;) )

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top