Qual é o caminho certo para escolher dinamicamente itens de menu para um menu de contexto em WinForms?
Pergunta
Eu estou tentando fazer um menu de contexto para um controle que está "ligada" a um item do menu principal. Há dois itens do menu fixo que estão sempre lá e um número arbitrário de itens de menu adicionais que poderá necessitar de ser no menu.
Eu tentei resolver o problema, mantendo uma referência de nível de classe para os itens do menu fixo e uma lista dos itens de menu dinâmico. Eu estou lidando com eventos Opening
de ambos os menus limpando a lista atual de itens, em seguida, adicionando os itens apropriados para o menu. Esta multa trabalha para o menu principal, mas o menu de contexto se comporta de forma estranha.
O principal problema parece ser que pelo Opening
tempo é levantada, o menu já decidiu quais itens ele vai display. Esta forma demonstra:
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public class DemoForm : Form
{
private List _items;
public DemoForm()
{
var contextMenu = new ContextMenuStrip();
contextMenu.Opening += contextMenu_Opening;
_items = new List();
_items.Add(new ToolStripMenuItem("item 1"));
_items.Add(new ToolStripMenuItem("item 2"));
this.ContextMenuStrip = contextMenu;
}
void contextMenu_Opening(object sender, CancelEventArgs e)
{
var menu = sender as ContextMenuStrip;
if (menu != null)
{
foreach (var item in _items)
{
menu.Items.Add(item);
}
}
}
}
}
Quando você clica com o botão direito do formulário pela primeira vez, nada será exibido. Na segunda vez, o menu é exibido como esperado. Existe um outro evento que é gerado onde eu poderia atualizar os itens? É uma prática ruim para escolher dinamicamente itens de menu?
( Nota:. Este é um exemplo que eu comecei a fazer para alguém que queria tal funcionalidade e eu estava curioso sobre como é difícil, por isso não posso fornecer detalhes sobre por que isso pode ser feito Essa pessoa quer com "link" um item do menu principal para o menu de contexto, e uma vez que os itens do menu só pode ser o filho de um único menu isso parecia uma forma razoável para fazê-lo. Todas as sugestões alternativas para uma abordagem são bem-vindos. )
Solução
Você poderia trabalhar para fora os itens durante o evento MouseDown do controle. Verifique que é o botão direito do mouse também.