获取包含子项(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拦截单击