我在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也忽略右键单击?
答案 0 :(得分:0)
我找到了一个相当复杂的五步解决方案。如果您有更直接的方法,请分享。
向表单类添加bool属性,例如:
private bool retryContextMenu = false;
向表单添加一个MouseClick事件处理程序,例如:
private void ctxMenu_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right) retryContextMenu = true;
else retryContextMenu = false;
}
请注意,在ItemClicked事件触发之前会触发MouseClick事件,而MouseClick可让您确定按下了哪个鼠标按钮。
将ContextMenuStrip的AutoClose属性设置为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;
...
}
}