获取包含子项(C#)的菜单项上的单击事件

获取包含子项(C#)的菜单项上的单击事件,c#,events,click,menuitem,C#,Events,Click,Menuitem,我正在创建一个上下文菜单,其中应包含所选文件夹中所有文件夹、子文件夹和文件的列表。我希望菜单在单击文件和文件夹时打开它们,但如果菜单项有子项,则不会注册单击事件 void Foo(string Title) { MenuItem = new MenuItem(Title); MenuItem.Click += new EventHandler(MenuItem_Click); ContextMenu.MenuItems.Add(MenuItem); } void Men

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

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

即使菜单项有子项,如何使单击事件触发?

听起来菜单可能不是这里最合适的UI小部件。我认为,您没有引发单击事件的原因是,假定具有子菜单的菜单项在单击时仅展开其子菜单项,而不是执行任何其他操作

这可能也是用户的假设

以下文件中提到了这种行为:

注意:如果 MenuItem包含任何项,此 未引发事件。这一事件并非如此 为父菜单项引发


如果从toolstrip启动弹出窗口,则可以将toolstrip子类化并添加此代码

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

我也遇到了同样的问题,解决方案是使用事件而不是单击事件。

它应该是一个很小的应用程序,可以非常轻松地访问大多数使用过的文件夹、文件、网站等。我的想法是一个带有右键单击菜单的托盘图标,因为我看不到任何其他控件,这些控件在不使用时很容易访问和隐藏。那么,没有办法提高活动的举行率了吗?我想,没有一个糟糕的黑客是不行的。不过,您可以在每个目录下添加一个名为“[此目录]”的“叶”菜单项。您如何检测用户单击导航和他们单击说“打开此目录”之间的区别?是的,“叶”菜单项是当前的实现,但我不太喜欢它。用户不需要单击来导航;弹出菜单是自动的(如果双击事件被支持,双击可以是一个最小化混乱的选项)。在某些情况下,弹出菜单可能是自动的,但许多人还是喜欢点击——我知道我是这样做的,因为它减少了意外悬停造成的混乱。这是一个确认步骤,我当然不希望它采取行动。我不确定该逻辑是否有效,但这是一个示例,用于将ContextMenu子类化,并使用您自己的逻辑通过if(item count>0)show subitems else show shortcut拦截单击