Comment ajouter un séparateur à un menu contextuel WinForms?


104

Sous mon contrôle, j'ai:

ContextMenu = new ContextMenu();
ContextMenu.MenuItems.Add(new MenuItem("&Add Item", onAddSpeaker));
ContextMenu.MenuItems.Add(new MenuItem("&Edit Item", onEditSpeaker));
ContextMenu.MenuItems.Add(new MenuItem("&Delete Item", onDeleteSpeaker));
ContextMenu.MenuItems.Add( ??? );
ContextMenu.MenuItems.Add(new MenuItem("Cancel"));

Comment ajouter une ligne de séparation à ce ContextMenu?


Quelle est l'utilité du «&» devant les noms?
Gerben Limburg

3
@GerbenLimburg: Le '&' vous permet de concevoir la touche de raccourci (elle est appelée " mnémonique ") qui sera disponible pour l'utilisateur (combinée avec Alt).
Otiel

Réponses:


226

Je crois que c'est juste un tiret:

ContextMenu.MenuItems.Add("-");

C'est l'un des nombreux éléments mal documentés de Windows. J'avais besoin de le faire il y a quelques mois. Je me suis souvenu que je pouvais le faire avec Win32, mais je ne me souvenais pas de la syntaxe. J'ai fini par extraire de vieux fichiers VC ++ 6 pour le trouver. D'ailleurs, je me réfère encore occasionnellement au "Livre Petzold" pour certaines choses. Wow, je me sens vieux ...
Brad Bruce

25
C'est sûrement plus lisible, ContextMenu.Items.Add(new ToolStripSeparator()); voir la réponse de Gabriel
MarkJ

9
@MarkJ, Le ContextMenu n'a plus de propriété Items. ToolStripSeperator () n'est pas non plus un argument valide pour ContextMenu.Items.Add ().
Cypher

3
Notez que vous pouvez le faire visuellement en entrant le trait d'union dans le champ de saisie «Tapez ici» du concepteur de menu dans le concepteur Windows Forms de Visual Studio. Le séparateur apparaîtra immédiatement dans le concepteur.
Buggieboy

La seule façon d'utiliser dans .NET Compact Framework.
Behzad Ebrahimi il y a

49

Cela fonctionne aussi bien que le tableau de bord, et je soupçonne que Winforms traduira le tiret en ToolStripSeparator. Pour ma part, je pense que cette solution est plus évidente pour quiconque doit maintenir le code.

yourContextMenu.Items.Add(new ToolStripSeparator());

5
La classe .Net 2 winforms ContextMenu n'a pas de propriété Items.
AndrewS

6
Cela n'est possible qu'avec un ContextMenuStrip et non avec un ContextMenu.
Gerben Limburg

1
Et vous pouvez le faire yourContextMenu.Items.Insert(3, new ToolStripSeparator());, mais vous ne pouvez pas Insertun tiret "-".
Otiel

1
Merci beaucoup
Garuda Prasad K


7

Si vous utilisez le Designer, placez un seul tiret "-" comme texte de la même manière que vous nommeriez vos éléments de menu. Après avoir appuyé sur Entrée, le séparateur sera créé.



1

Les séparateurs horizontaux sont cool, mais que faire si vous voulez plutôt un séparateur vertical?

Eh bien, ne vous inquiétez pas - vous pouvez en avoir un!

Définissez la BarBreakpropriété truesur le MenuItemqui devrait être le premier après le séparateur:

var item = new MenuItem(text: "Settings", onClick: SomeFunction) { BarBreak = true };

entrez la description de l'image ici

Pour ajouter l'article à une MenuItemscollection: yourContextMenu.MenuItems.Add(item).


0

Peut-être que dans les versions ultérieures de Visual Studio, ils ont rendu cela plus simple. J'utilise VS 2012. Vous pouvez ajouter un séparateur via le concepteur de formulaires. 1) Sélectionnez / Créez un MenuStrip. 2) Sur "Tapez ici", avec le bouton droit de la souris. 3) Sélectionnez "Insérer". 4) Sélectionnez "Séparateur". 5) Faites glisser le nouveau séparateur vers le texte que vous souhaitez qu'il soit au-dessus. Terminé.


0

ContextMenua un constructeur qui reçoit un tableau d' MenuItemobjets. Inutile de dire que vous ne pouvez pas ajouter de chaîne à ce tableau. Vous pouvez cependant obtenir un séparateur en ajoutant un new MenuItem("-"):

    var contextMenu = new ContextMenu(new[]
    {
        timerMenuItem,
        keypressMenuItem,
        new MenuItem("-"), // Seperator
        new MenuItem(text: "Exit", onClick: (sender, args) => Application.Exit())
    });
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.