[英]Make context menu ignore right-click when user is selecting a context menu item
我在Visual Studio C#IDE中定义了一个ContextMenuStrip上下文菜单,并对程序进行了编码,以便在用户右键单击屏幕上的对象时成功弹出上下文菜单。 用户可以从上下文菜单中选择项目,并且代码成功确定用户选择了哪个上下文菜单项。 到现在为止还挺好。 问题是上下文菜单接受右键单击作为选择上下文菜单项的机制。 当我不小心双击屏幕上的一个对象时,我注意到了这一点......第一次点击弹出菜单,第二次点击最终选择了碰巧在鼠标光标下绘制的上下文菜单项。
我的搜索只会导致弹出上下文菜单以响应右键单击,而不是在显示菜单时如何处理(或忽略)右键单击。
这是显示上下文菜单的命令:
ctxMenu.Show(this, pt);
其中“this”是表单,“pt”是单击鼠标的表单上的点。
这是在选择上下文菜单项时触发的代码片段:
private void ctxMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
// Make context menu go away
ctxMenu.Hide();
switch (e.ClickedItem.Text)
{
case "blah blah blah"
...
break;
}
}
Word和Excel等Microsoft Office产品中的上下文菜单忽略了右键单击,即使是显示子菜单也是如此。 有没有办法让C#ContextMenuStrip忽略右键点击?
我发现了一个相当复杂的5步解决方案。 如果您有任何更直接的方法,请分享。
将bool属性添加到表单类,例如:
private bool retryContextMenu = false;
向表单添加MouseClick事件处理程序,例如:
private void ctxMenu_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) retryContextMenu = true; else retryContextMenu = false; }
请注意,MouseClick事件在ItemClicked事件发生之前触发,MouseClick允许您识别按下了哪个鼠标按钮。
将ContextMenuStrip的AutoClose属性设置为FALSE。 当它被设置为默认值true时,我无法阻止菜单自行关闭。 即使在Closed事件中向ctxMenu.Show()
添加条件调用也不会使菜单可见。
添加方法以关闭上下文菜单并重置标志,例如:
private void CancelPopup() { if (ctxMenu.Visible) ctxMenu.Close(); retryContextMenu = false; }
在我的例子中,我在所有用户点击鼠标的方法中添加了对CancelPopup()的调用。
将先前显示的ItemClicked事件处理程序修改为:
private void ctxMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { if (retryContextMenu) return; // If not a valid user click, don't process CancelPopup(); // Make context menu go away switch (e.ClickedItem.Text) { case "blah blah blah": ... break; ... } }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.