在C#外面鼠标点击关闭上下文菜单

时间:2011-11-17 19:53:45

标签: c# wpf contextmenu

我有一个关于鼠标右键单击事件的监听器,它会触发CreateContextMenu()

该功能如下所示:

protected virtual ContextMenu CreateContextMenu()
    {
        ContextMenu contextMenu = new ContextMenu();

        MenuItem ClickHereMenuItem = new MenuItem();
        ClickHereMenuItem.Header = "Click Here";
        ClickHereMenuItem.Tag = contextMenu;
        ClickHereMenuItem.Click += ClickHere_Click;

        contextMenu.Items.Add(ClickHereMenuItem);

        contextMenu.Items.Add(new Separator());

        //Cancel Menu Item
        MenuItem cancelMenuItem = new MenuItem();
        cancelMenuItem.Header = "Cancel";
        cancelMenuItem.Tag = contextMenu;
        cancelMenuItem.Click += cancelMenuItem_Click;

        contextMenu.Items.Add(cancelMenuItem);
        return contextMenu; 
    }

一切都按预期工作,但上下文菜单关闭的唯一方法是选择“取消”菜单项(仅设置contextMenu.IsOpen = false)。如果用户在Control外部单击,我还希望关闭菜单。我怎么能做到这一点?

2 个答案:

答案 0 :(得分:0)

尝试使用dispose方法将其关闭

.Dispose()

答案 1 :(得分:0)

创建一个Canvas布局,其高度和宽度占据应用程序窗口大小,将其可见性设置为隐藏,然后将上下文菜单作为子项添加到画布。现在,您可以处理canvas的MouseLeftButtonDown事件,并在其中设置contextMenu.IsOpen = false。现在这个画布占据了你的应用程序的整个工作区域,所以只要你点击右键,就可以打开上下文菜单,只要用户点击左键,就可以关闭上下文菜单。

这是弹出窗口,上下文菜单等在Windows和Web应用程序中的工作方式。

代码与此类似,

Canvas canvas = new Canvas();
canvas.Height = Application.Height; //replace with ur app height
canvas.Width = Application.Width; //replace with ur app width
canvas.Child(ContextMenu); 
canvas.MouseLeftButtonDown += (s,e) => { contextMenu.IsOpen = false};

这不是实际代码,请将其用作参考。