如何查找上下文菜单已显示,而不是处理单击事件

时间:2011-08-08 10:58:48

标签: c# custom-controls contextmenu mouseevent

我有一个简单的问题,

我正在开发自定义图表控件。图表控件允许用户绘制线条或删除矩形(可以是任何东西)。此开始绘制/放置选项设置为控制鼠标按下,左键单击和鼠标按下右键单击设置为显示上下文菜单。

我的问题是,如果用户决定不选择任何内容并在显示时从上下文菜单中显示,则应该左键单击控件,因为右键单击将再次显示菜单。但目前上下文菜单是尿布,左键的其余部分也执行了。如何验证左键单击上显示的上下文菜单,用户希望从上下文菜单中退出,而不是执行开始绘制/删除逻辑。

其他信息: 我正在研究C#项目,我尝试捕获上下文菜单关闭事件,但它在控制鼠标按下事件之前触发并关闭,我无法验证是否显示了上下文菜单以避免通过鼠标左键的其余部分事件逻辑。

我们非常感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:2)

这是一个简单的解决方案。

假设您的表单上有一个ListBox控件,该控件具有与之关联的ContextMenu。现在我们想要在每次单击时向控件添加一个列表项:

    private void listBox1_MouseClick(object sender, MouseEventArgs e)
    {
        listBox1.Items.Add("new item added - " + DateTime.Now.ToLongTimeString());
    }

现在在表单级别定义一个名为 menuClosed 的bool变量,如下所示:

private bool menuClosed = false;

现在捕捉上下文菜单的 Closed 事件,然后翻转标志:

    private void contextMenuStrip1_Closed(object sender, ToolStripDropDownClosedEventArgs e)
    {
        menuClosed = true;
    }

现在更新将项目添加到列表框控件的代码,如下所示:

    private void listBox1_MouseClick(object sender, MouseEventArgs e)
    {
        if (!menuClosed)
            listBox1.Items.Add("new item added - " + DateTime.Now.ToLongTimeString());
    }

我只是在关闭上下文菜单时将bool变量设置为true,然后检查bool标志以查看是否应该将项添加到列表中。您可以使用这种相同的机制来确定应该执行的特定命令。