当用户在菜单外单击时,如何使我的WPF上下文菜单消失?

时间:2011-04-04 03:09:10

标签: wpf forms contextmenu notifyicon lostfocus

首先,标准信息:

VS2010旗舰版 Win7旗舰版x64
WPF应用程序

WPF上下文菜单:

    <ContextMenu x:Key="RightClickSystemTray" Placement="MousePoint">
        <MenuItem Header="Exit" Click="Menu_Exit"></MenuItem>
    </ContextMenu>

显示它的代码:

    void _notifyIcon_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {
            ContextMenu menu = (ContextMenu)this.FindResource("RightClickSystemTray");
            menu.IsOpen = true;
        }
    }

上下文菜单是在XAML中构建的WPF ContextMenu。系统托盘中的通知图标是表单通知图标(我不知道本机WPF通知图标)。因此,不使用notifyicon.ContextMenu属性。上面的代码工作正常。当用户右键单击通知图标时,上下文菜单会显示它应该显示的内容。

我遇到的问题是让ContextMenu在我想要的时候消失。只要你点击WPF应用程序中的某个地方,它就会消失。此行为是自动的。但是,如果用户点击其他地方,例如任务栏,则菜单不会消失。 “LostFocus”事件不会触发,因为这些类型的事件仅在元素失去焦点到同一应用程序中的另一个元素时触发。就应用而言,ContextMenu永远不会失去焦点。 “Deactivated”是我试图使用的另一个事件。此时我应该澄清应用程序有一个“接近托盘”选项,因此应用程序可以在用户有机会右键单击并显示菜单之前关闭并触发已停用的事件。当菜单出现时,应用程序不会重新激活,因此当我单击任务栏时,停用的甚至不会触发。

最后,问题。当用户点击它时,如何让我的上下文菜单消失,即使用户点击的位置不在创建上下文菜单的应用程序中?

1 个答案:

答案 0 :(得分:0)

我不知道这是否是一个可行的选择,但是如果你切换到this library,你将为WPF提供一个很好的集成托盘图标,而不会出现这样的问题(还有ContextMenus的示例代码)< / p>