当前位置: 首页 > 知识库问答 >
问题:

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

储修谨
2023-03-14

我在Visual Studio C#IDE中定义了一个ContextMenuStri上下文菜单,并对程序进行编码,以便当用户右键单击屏幕上的一个对象时,上下文菜单成功弹出。用户可以从上下文菜单中选择一个项目,代码成功确定用户选择了哪个上下文菜单项。到目前为止还不错。问题是上下文菜单接受右键单击作为选择上下文菜单项的机制。当我不小心双击右键单击屏幕上的一个对象时,我注意到了这一点...菜单在第一次单击时弹出,第二次立即单击最终选择了碰巧在鼠标光标下绘制的上下文菜单项。

我的搜索只导致了右键单击时弹出上下文菜单的方法,而不是如何在菜单显示时处理(或忽略)右键单击。

下面是显示上下文菜单的命令:

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#ContextMenuStri也忽略右键单击?

共有1个答案

商天逸
2023-03-14

我找到了一个相当复杂的五步解决方案。如果你们有更直接的方法,请分享。

>

  • 向表单类添加bool属性,例如:

    private bool retryContextMenu=false

    向窗体添加MouseClick事件处理程序,例如:

    私有空ctxMenu_MouseClick(对象发送者,MouseEventArgs e){if(e. Button==MouseButton. right)retryContextMenu=true;否则retryContextMenu=false;}

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

    将ContextMenuStri的自动关闭属性设置为FALSE。当它被设置为默认值true时,我无法阻止菜单自动关闭。即使在关闭事件中向ctxMenu. show()添加条件调用也不能保持菜单可见。

    添加关闭上下文菜单和重置标志的方法,例如:

    私有的无效取消弹出(){if(ctxMenu. Vitive)ctxMenu.关闭(); retryContextMenu=false;}

    在我的例子中,我在所有由用户点击任何类型的鼠标触发的方法中添加了对取消弹出()的调用。

    将之前显示的ItemClicked事件处理程序修改为:

    私有空ctxMenu_ItemClicked(对象发送者,ToolStripItemClickedEventArgs e){if(retryContextMenu)返回;//如果不是有效的用户单击,不处理取消弹出(); // 使上下文菜单走开开关(e. ClickedItem. Text){case"blah blah blah":...中断;...}}

  •  类似资料:
    • 我在上下文菜单中使用右键单击功能时遇到问题。我的菜单项没有显示,因为我的第二个ngFor=“let row”条件。。。但我需要右键单击选中的行对象,以便从该行传入json值。 现在模式正在弹出,但没有显示菜单项按钮,因此我无法使用click事件。 我做错了什么? view.component.html view.component.ts

    • 问题内容: 这并不是说我要防止“查看源代码”或类似的愚蠢行为,而是要为某些元素制作一些自定义上下文菜单。 编辑:答案的答复:我已经尝试过: 问题答案: 捕获事件,然后在事件处理程序中返回false。 无论如何,您也可以在某些浏览器中捕获click事件并使用哪个鼠标按钮触发该事件。

    • 问题内容: 我当前正在通过右键单击实例化并将其位置设置为鼠标位置的位置来创建右键单击上下文菜单。是否有更好的方法? 问题答案: 您可能正在手动调用菜单。这会导致菜单中出现一些令人讨厌的越野车行为。 该方法处理所有需要发生的事情(在鼠标悬停时突出显示事情,并在必要时关闭弹出窗口),其中使用只是显示菜单而无需添加任何其他行为。 要进行右键单击弹出菜单,只需创建一个。 然后,您所要做的就是向要弹出菜单的

    • 问题内容: 我已经尝试了一切。我认为他们犯了一个大错误,就是在任何情况下都未引用索引单元格。 我可以得到菜单,但位置不正确。右键单击即可。 在我的TreeView中,我可以使用get KeyReleased,但是我不知道将菜单放在哪里。 没有一种布局方法会给我TreeCell的坐标 问题答案: 根本不可能为给定项目提供对单元格的API访问。并非每个项目都有与之关联的单元格。最重要的是,由单元格表示

    • 问题内容: 我有随ArcGIS 10.2.2一起安装的Python 2.7.5。当我第一次右键单击.py脚本时,我先前已经编写了该脚本,并在上下文菜单中列出了“使用IDLE编辑”选项。但是,当我右键单击.py文件时,此选项不再出现。 我已经阅读了许多有关此问题的线程,并尝试了其中的一些线程,例如修改/删除注册表项,然后重新安装/修复软件。目前,我对使用IDE并不感兴趣,尽管许多人很高兴知道以后打算

    • 编辑:Calrification-标签内容是窗格(VBox,GridPane,等等),所以直接在内容上设置ContextMenu是不可能的。