Wie füge ich einem WinForms ContextMenu ein Trennzeichen hinzu?

103

In meiner Kontrolle habe ich:

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"));

Wie füge ich diesem Kontextmenü eine Trennlinie hinzu?

Adam Pierce
quelle
Was nützt das '&' vor den Namen?
Gerben Limburg
3
@GerbenLimburg: Mit dem '&' können Sie die Tastenkombination (" Mnemonik " genannt) entwerfen, die dem Benutzer zur Verfügung steht (kombiniert mit Alt).
Otiel

Antworten:

225

Ich glaube, es ist nur ein Strich:

ContextMenu.MenuItems.Add("-");
SqlRyan
quelle
Dies ist eines von vielen schlecht dokumentierten Elementen in Windows. Ich musste das vor ein paar Monaten tun. Ich erinnerte mich, dass ich es in Win32 tun konnte, aber ich konnte mich nicht an die Syntax erinnern. Am Ende habe ich einige alte VC ++ 6-Dateien aufgerufen, um sie zu finden. Übrigens beziehe ich mich gelegentlich immer noch für einige Dinge auf "The Petzold Book". Wow, ich fühle mich alt ...
Brad Bruce
24
Sicher ist dies besser lesbar, ContextMenu.Items.Add(new ToolStripSeparator()); siehe Gabriels Antwort
MarkJ
9
@MarkJ, Das ContextMenu hat keine Items-Eigenschaft mehr. ToolStripSeperator () ist auch kein gültiges Argument für ContextMenu.Items.Add ().
Cypher
3
Beachten Sie, dass Sie dies visuell tun können, indem Sie den Bindestrich in das Eingabefeld "Hier eingeben" des Menü-Designers im Windows Forms-Designer von Visual Studio eingeben. Das Trennzeichen wird sofort im Designer angezeigt.
Buggieboy
48

Dies funktioniert genauso gut wie der Bindestrich, und ich vermute, dass die Winforms den Bindestrich in einen ToolStripSeparator übersetzen werden. Ich denke, diese Lösung ist für jeden, der den Code pflegen muss, offensichtlicher.

yourContextMenu.Items.Add(new ToolStripSeparator());
Gabriel
quelle
5
Die ContextMenu-Klasse von .Net 2 winforms verfügt nicht über eine Items-Eigenschaft.
AndrewS
6
Dies ist nur mit einem ContextMenuStrip und nicht mit einem ContextMenu möglich.
Gerben Limburg
1
Und Sie können tun yourContextMenu.Items.Insert(3, new ToolStripSeparator());, aber Sie können kein InsertBindestrich "-".
Otiel
1
Perfekt Vielen Dank
Garuda Prasad K
11

In WPF:

ContextMenu.MenuItems.Add(new Separator());
al2suarez
quelle
7

Wenn Sie den Designer verwenden, setzen Sie einen einzelnen Bindestrich "-" als Text so, wie Sie Ihre Menüelemente benennen würden. Nach dem Drücken der Eingabetaste wird das Trennzeichen erstellt.

Aziz
quelle
3

Setzen Sie die Texteigenschaft auf einen Bindestrich.

shahkalpesh
quelle
1

Horizontale Trennzeichen sind cool, aber was ist, wenn Sie stattdessen ein vertikales Trennzeichen möchten?

Nun, mach dir keine Sorgen - du kannst eins haben!

Setzen Sie die BarBreakEigenschaft trueauf die, MenuItemdie die erste nach dem Trennzeichen sein soll:

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

Geben Sie hier die Bildbeschreibung ein

So fügen Sie den Artikel einer MenuItemsSammlung hinzu : yourContextMenu.MenuItems.Add(item).

Stephen Kennedy
quelle
0

Vielleicht haben sie dies in späteren Versionen von Visual Studio einfacher gemacht. Ich verwende VS 2012. Sie können über den Formular-Designer ein Trennzeichen hinzufügen. 1) Wählen Sie einen MenuStrip aus. 2) Klicken Sie bei "Hier eingeben" mit der rechten Maustaste. 3) Wählen Sie "Einfügen". 4) Wählen Sie "Separator". 5) Ziehen Sie das neue Trennzeichen auf den Text, über dem es sich befinden soll. Getan.

JimMoore
quelle
0

ContextMenuhat einen Konstruktor, der ein Array von MenuItemObjekten empfängt . Natürlich können Sie diesem Array keine Zeichenfolge hinzufügen. Sie können jedoch einen Separator erhalten, indem Sie Folgendes hinzufügen new MenuItem("-"):

    var contextMenu = new ContextMenu(new[]
    {
        timerMenuItem,
        keypressMenuItem,
        new MenuItem("-"), // Seperator
        new MenuItem(text: "Exit", onClick: (sender, args) => Application.Exit())
    });
Stephen Kennedy
quelle