5

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

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

即使菜单项有子项,我怎样才能触发点击事件?

4

3 回答 3

5

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

这也可能是用户的假设。

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

注意:如果 MenuItem 的 MenuItems 属性包含任何项目,则不会引发此事件。不会为父菜单项引发此事件。

于 2009-08-09T15:55:19.643 回答
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
  }
}
于 2009-08-10T03:02:56.433 回答
0

我有同样的问题,解决方案是使用MenuItem.SubmenuOpened事件而不是点击事件。

于 2018-11-20T22:55:46.683 回答