C# 在鼠标上关闭关联菜单单击C外部#

C# 在鼠标上关闭关联菜单单击C外部#,c#,wpf,contextmenu,C#,Wpf,Contextmenu,我在鼠标右键单击事件上有一个侦听器,该事件会触发CreateContextMenu() 函数如下所示: protected virtual ContextMenu CreateContextMenu() { ContextMenu contextMenu = new ContextMenu(); MenuItem ClickHereMenuItem = new MenuItem(); ClickHereMenuItem.Header =

我在鼠标右键单击事件上有一个侦听器,该事件会触发
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
)。如果用户在控件外单击,我还希望菜单关闭。如何完成此操作?

请尝试使用dispose方法将其关闭

.Dispose()

创建一个画布布局,其高度和宽度占据应用程序窗口大小,将其可见性设置为隐藏,然后将关联菜单作为子菜单添加到画布中。现在,您可以处理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};

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

您使用的是什么GUI?Windows窗体?我无法重现您的问题:使用您的代码,我的上下文菜单关闭正常。因此,问题必须在PreviewMouse(左)按钮下或其他地方。@mhn我使用的是WPF GUI,所以在
System.Windows.Control.ContextMenu
之外单击以关闭它是默认功能吗?为什么这不起作用呢?除了OnRightMouseclick,我没有重载任何东西..OnRightMouseclick重载???你的意思是向OnRightMouseClick添加事件处理程序,不是吗?(您必须有一些很好的理由来重载,而不是仅仅为一个到目前为止似乎很简单的案例添加事件处理程序。)