在子项目的菜单项上获取点击事件(C#)

时间:2009-08-09 15:51:17

标签: c# events click menuitem

我正在创建一个上下文菜单,其中应包含所选文件夹中所有文件夹,子文件夹和文件的列表。我希望菜单在单击时打开文件和文件夹,但如果menuitem有子项,则不会注册click事件。

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

即使menuitem有子项,我如何才能点击事件?

3 个答案:

答案 0 :(得分:5)

这听起来像菜单可能不是最合适的UI小部件。我相信你没有得到点击事件的原因是,带有子菜单的菜单项被假定为在点击时展开他们的孩子,而不是执行任何其他动作。

这也可能是用户的假设。

MenuItem.Click的文档中提到了此行为:

  

注意:如果是MenuItems属性   MenuItem包含任何项目   事件没有提出。这个事件不是   为父菜单项提出。

答案 1 :(得分:1)

如果您从工具条启动弹出窗口,则可以继承工具条并添加此代码。

  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
  }
}

答案 2 :(得分:0)

我遇到了同样的问题,解决方案是使用MenuItem.SubmenuOpened事件而不是click事件。