当用户选择上下文菜单项时,使上下文菜单忽略右键单击
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 步解决方案。如果大家有更直接的方法,欢迎分享。
在class的形式中添加一个bool 属性,如:
private bool retryContextMenu = false;
在窗体中添加鼠标点击事件处理程序,例如:
private void ctxMenu_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right) retryContextMenu = true;
else retryContextMenu = false;
}
请注意,MouseClick 事件在 ItemClicked 事件之前触发,并且 MouseClick 可让您识别按下的是哪个鼠标按钮。
将 ContextMenuStrip 的自动关闭 属性 设置为 FALSE。当它设置为默认值 true 时,我无法阻止菜单自行关闭。甚至添加条件调用
ctxMenu.Show()
在 Closed 事件中没有保持菜单可见。
添加关闭上下文菜单和重置标志的方法,例如:
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;
...
}
}
我在 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 步解决方案。如果大家有更直接的方法,欢迎分享。
在class的形式中添加一个bool 属性,如:
private bool retryContextMenu = false;
在窗体中添加鼠标点击事件处理程序,例如:
private void ctxMenu_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) retryContextMenu = true; else retryContextMenu = false; }
请注意,MouseClick 事件在 ItemClicked 事件之前触发,并且 MouseClick 可让您识别按下的是哪个鼠标按钮。
将 ContextMenuStrip 的自动关闭 属性 设置为 FALSE。当它设置为默认值 true 时,我无法阻止菜单自行关闭。甚至添加条件调用
ctxMenu.Show()
在 Closed 事件中没有保持菜单可见。添加关闭上下文菜单和重置标志的方法,例如:
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; ... } }