Como adicionar um separador a um ContextMenu WinForms?

103

Dentro do meu controle, tenho:

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

Como adicionar uma linha de separação a este ContextMenu?

Adam Pierce
fonte
Qual é o uso do '&' na frente dos nomes?
Gerben Limburg
3
@GerbenLimburg: O '&' permite que você crie a tecla de atalho (é chamada de " mnemônica ") que estará disponível para o usuário (combinada com Alt).
Otiel

Respostas:

225

Acredito que seja apenas um traço:

ContextMenu.MenuItems.Add("-");
SqlRyan
fonte
Este é um dos muitos itens mal documentados no Windows. Eu precisava fazer isso há alguns meses. Lembrei-me de que poderia fazer isso no Win32, mas não conseguia lembrar a sintaxe. Acabei puxando alguns arquivos VC ++ 6 antigos para encontrá-lo. A propósito, eu ainda ocasionalmente me refiro ao "Livro Petzold" para algumas coisas. Uau, estou me sentindo velho ...
Brad Bruce
24
Certamente isso é mais legível, ContextMenu.Items.Add(new ToolStripSeparator()); veja a resposta de Gabriel
MarkJ
9
@MarkJ, The ContextMenu não tem mais uma propriedade Items. ToolStripSeperator () também não é um argumento válido para ContextMenu.Items.Add ().
Cypher
3
Observe que você pode fazer isso visualmente inserindo o hífen no campo de entrada "Digite aqui" do designer de menu no designer de Formulários do Windows do Visual Studio. O separador aparecerá imediatamente no designer.
Buggieboy de
48

Isso funciona tão bem quanto o traço, e suspeito que o WinForms traduzirá o traço em um ToolStripSeparator. Eu, pelo menos, acho que essa solução é mais óbvia para quem precisa manter o código.

yourContextMenu.Items.Add(new ToolStripSeparator());
Gabriel
fonte
5
A classe ContextMenu .Net 2 winforms não tem uma propriedade Items.
AndrewS
6
Isso só é possível com um ContextMenuStrip e não com um ContextMenu.
Gerben Limburg
1
E você pode fazer yourContextMenu.Items.Insert(3, new ToolStripSeparator());, mas você não pode Insertum traço "-".
Otiel,
1
Perfeito, muito obrigado
Garuda Prasad K
11

No WPF:

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

Se você estiver usando o Designer, coloque um único hífen "-" como texto da mesma maneira que você nomearia seus itens de menu. Após pressionar Enter, o separador será criado.

Aziz
fonte
3

Defina a propriedade do texto como um hífen.

Shahkalpesh
fonte
1

Separadores horizontais são legais, mas e se você quiser um separador vertical?

Bem, não se preocupe - você pode ter um!

Defina a BarBreakpropriedade como trueno MenuItemqual deve ser o primeiro após o separador:

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

insira a descrição da imagem aqui

Para adicionar o item a uma MenuItemscoleção: yourContextMenu.MenuItems.Add(item).

Stephen Kennedy
fonte
0

Talvez em versões posteriores do Visual Studio eles tenham tornado isso mais simples. Estou usando o VS 2012. Você pode adicionar um separador por meio do designer de formulários. 1) Selecione / crie um MenuStrip. 2) Em "Digite Aqui", clique com o botão direito do mouse. 3) Selecione "Inserir". 4) Selecione "Separador". 5) Arraste o novo separador até o texto que você deseja que fique acima. Feito.

JimMoore
fonte
0

ContextMenutem um construtor que recebe uma matriz de MenuItemobjetos. Desnecessário dizer que você não pode adicionar uma string a esse array. No entanto, você pode obter um separador adicionando um new MenuItem("-"):

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