我正在创建一个上下文菜单,其中应包含所选文件夹中所有文件夹,子文件夹和文件的列表。我希望菜单在单击时打开文件和文件夹,但如果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有子项,我如何才能点击事件?
答案 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事件。