繁体   English   中英

当用户选择上下文菜单项时,右键单击上下文菜单

[英]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步解决方案。 如果您有任何更直接的方法,请分享。

  1. 将bool属性添加到表单类,例如:

    private bool retryContextMenu = false;

  2. 向表单添加MouseClick事件处理程序,例如:

    private void ctxMenu_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) retryContextMenu = true; else retryContextMenu = false; }

请注意,MouseClick事件在ItemClicked事件发生之前触发,MouseClick允许您识别按下了哪个鼠标按钮。

  1. 将ContextMenuStrip的AutoClose属性设置为FALSE。 当它被设置为默认值true时,我无法阻止菜单自行关闭。 即使在Closed事件中向ctxMenu.Show()添加条件调用也不会使菜单可见。

  2. 添加方法以关闭上下文菜单并重置标志,例如:

    private void CancelPopup() { if (ctxMenu.Visible) ctxMenu.Close(); retryContextMenu = false; }

在我的例子中,我在所有用户点击鼠标的方法中添加了对CancelPopup()的调用。

  1. 将先前显示的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM