Как добавить разделитель в WinForms ContextMenu?

104

Под моим контролем у меня есть:

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

Как добавить разделительную линию в это ContextMenu?

Адам Пирс
источник
Какая польза от "&" перед именами?
Гербен Лимбург
3
@GerbenLimburg: '&' позволяет создать комбинацию клавиш (она называется « мнемоническая »), которая будет доступна пользователю (в сочетании с Alt).
Otiel

Ответы:

226

Я считаю, что это просто черточка:

ContextMenu.MenuItems.Add("-");
SqlRyan
источник
Это один из многих плохо документированных элементов Windows. Мне нужно было сделать это несколько месяцев назад. Я вспомнил, что могу сделать это в Win32, но не мог вспомнить синтаксис. В итоге я нашел несколько старых файлов VC ++ 6. Кстати, я до сих пор иногда по каким-то вопросам обращаюсь к "Книге Петцольда". Вау, я чувствую себя старым ...
Брэд Брюс
25
Конечно, это более читабельно, ContextMenu.Items.Add(new ToolStripSeparator()); см . Ответ Габриэля
MarkJ
9
@MarkJ, ContextMenu больше не имеет свойства Items. ToolStripSeperator () также не является допустимым аргументом для ContextMenu.Items.Add ().
Cypher
3
Обратите внимание, что это можно сделать визуально, введя дефис в поле ввода «Введите здесь» конструктора меню в конструкторе Windows Forms Visual Studio. Разделитель сразу появится в дизайнере.
Buggieboy
Единственный способ использовать в .NET Compact Framework.
Behzad Ebrahimi
49

Это работает так же хорошо, как и тире, и я подозреваю, что Winforms переведет тире в ToolStripSeparator. Я, например, думаю, что это решение более очевидно для всех, кто должен поддерживать код.

yourContextMenu.Items.Add(new ToolStripSeparator());
Габриэль
источник
5
Класс .Net 2 winforms ContextMenu не имеет свойства Items.
AndrewS
6
Это возможно только с ContextMenuStrip, но не с ContextMenu.
Гербен Лимбург
1
И можно yourContextMenu.Items.Insert(3, new ToolStripSeparator());, но нельзя Insertтире "-".
Otiel 07
1
Perfect Большое спасибо
Garuda Prasad K
11

В WPF:

ContextMenu.MenuItems.Add(new Separator());
al2suarez
источник
7

Если вы используете Дизайнер, поместите один дефис «-» в качестве текста так же, как вы бы назвали свои пункты меню. После нажатия Enter будет создан разделитель.

Азиз
источник
3

Установите для свойства текста дефис.

Шахкалпеш
источник
1

Горизонтальные разделители - это круто, но что, если вам нужен вертикальный разделитель?

Что ж, не волнуйтесь - вы можете получить одну!

Установить BarBreakсвойство trueна MenuItemкоторый должен быть первым после разделителя:

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

введите описание изображения здесь

Чтобы добавить элемент в MenuItemsколлекции: yourContextMenu.MenuItems.Add(item).

Стивен Кеннеди
источник
0

Возможно, в более поздних версиях Visual Studio это стало проще. Я использую VS 2012. Вы можете добавить разделитель через конструктор форм. 1) Выберите / создайте MenuStrip. 2) На «Введите здесь» правой кнопкой мыши. 3) Выберите «Вставить». 4) Выберите «Разделитель». 5) Перетащите новый разделитель к тексту, который вы хотите разместить выше. Готово.

Джим Мур
источник
0

ContextMenuимеет конструктор, который получает массив MenuItemобъектов. Излишне говорить, что вы не можете добавить строку в этот массив. Однако вы можете получить разделитель, добавив new MenuItem("-"):

    var contextMenu = new ContextMenu(new[]
    {
        timerMenuItem,
        keypressMenuItem,
        new MenuItem("-"), // Seperator
        new MenuItem(text: "Exit", onClick: (sender, args) => Application.Exit())
    });
Стивен Кеннеди
источник