首页 > 解决方案 > 当用户选择上下文菜单项时,使上下文菜单忽略右键单击

问题描述

我在 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;
  }
}

Microsoft Office 产品(如 Word 和 Excel)中的上下文菜单忽略右键单击,即使显示子菜单也是如此。有没有办法让 C# ContextMenuStrip 也忽略右键单击?

标签: c#contextmenuright-click

解决方案


我找到了一个相当复杂的 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; ... } }


推荐阅读