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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top