Obter eventos clique em um item de menu com subitens (C #)
Pergunta
Estou criando um contextmenu que deve conter uma lista de todas as pastas, subpastas e arquivos em uma pasta escolhida. Eu quero que o menu para abrir os arquivos e pastas quando eles são clicados, mas o evento clique não registra se o menuitem tem subitens.
void Foo(string Title)
{
MenuItem = new MenuItem(Title);
MenuItem.Click += new EventHandler(MenuItem_Click);
ContextMenu.MenuItems.Add(MenuItem);
}
void MenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("This box will only show when menuitems without subitems are clicked");
}
Como posso fazer o fogo clique evento, mesmo que o item de menu tem subitens?
Solução
Parece que um menu pode não ser a interface mais apropriada Widget aqui. Acredito que a razão você não receber um evento de clique levantada é que os itens do menu com submenus são assumidos como única expandir seus filhos quando clicado, em vez de executar qualquer outra ação.
Isso é provável que seja a suposição de que o usuário também.
Este comportamento é mencionada na documentação para MenuItem.Click
:
Nota: Se o MenuItems propriedade para o MenuItem contém nenhum item, este evento não é gerado. Este evento não é levantadas para itens de menu pai.
Outras dicas
Se você lançou o seu pop-up a partir de um toolstrip, você pode subclasse o toolstrip e adicionar este código.
override protected void OnItemClicked(ToolStripItemClickedEventArgs e)
{
if (this.Items.Count == 0)
base.OnItemClicked(e);
// else do nothing
}
No entanto, a classe ContextMenu não ter OnItemClicked, mas tem onPopup. Eu não tentei isso, mas você pode tentar subclasse o ContextMenu
public class MyContextMenu : ContextMenu
{
override protected void OnPopUp(EventArgs e)
{
if (this.MenuItems.Count == 0)
base.OnPopUp(e);
// else do nothing
}
}
Se isso não funcionar, então, você poderia substituir os dois métodos mostram
public class MyContextMenu : ContextMenu
{
override protected void Show (Control c, Point p)
{
if (this.MenuItems.Count == 0)
base.Show (c, p) ;
// else do nothing
}
override protected void (Control c, Point p, LeftRightAlignment z)
{
if (this.MenuItems.Count == 0)
base.Show (c, p, z) ;
// else do nothing
}
}
Eu tive o mesmo problema, a solução foi usar o MenuItem.SubmenuOpened
evento em vez do evento clique.