Получить событие нажатия на элемент меню с подпунктами (C #) - PullRequest
4 голосов
/ 09 августа 2009

Я создаю контекстное меню, которое должно содержать список всех папок, подпапок и файлов в выбранной папке. Я хочу, чтобы меню открывало файлы и папки при их нажатии, но событие щелчка не регистрируется, если в элементе меню есть подпункты.

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

Как заставить событие click срабатывать, даже если в пункте меню есть подэлементы?

Ответы [ 3 ]

5 голосов
/ 09 августа 2009

Звучит так, что меню может быть не самым подходящим виджетом интерфейса. Я полагаю, что причина, по которой вы не получаете событие click, заключается в том, что пункты меню с подменю, как предполагается, только расширяют своих дочерних элементов при нажатии, а не выполняют какое-либо другое действие.

Вероятно, это тоже предположение пользователя.

Это поведение упоминается в документации для MenuItem.Click:

Примечание. Если свойство MenuItems для MenuItem содержит любые элементы, это событие не возбуждено. Это событие не поднят для родительских пунктов меню.

1 голос
/ 10 августа 2009

Если вы запустили всплывающее окно из панели инструментов, вы можете создать подкласс для панели инструментов и добавить этот код.

  override protected void OnItemClicked(ToolStripItemClickedEventArgs e)
  {
    if (this.Items.Count == 0)
      base.OnItemClicked(e);

    // else do nothing
  }

Однако класс ContextMenu не имеет OnItemClicked, но имеет OnPopup. Я не пробовал, но вы можете попробовать создать подклассы ContextMenu

public class MyContextMenu : ContextMenu
{
  override protected void OnPopUp(EventArgs e)
  {
        if (this.MenuItems.Count == 0)
          base.OnPopUp(e);

        // else do nothing
  }
}

если это не сработает, вы можете переопределить два метода show

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
  }
}
0 голосов
/ 21 ноября 2018

У меня была та же проблема, решение было использовать событие MenuItem.SubmenuOpened вместо события click.

...