Как сделать, чтобы мое контекстное меню WPF исчезло, когда пользователь щелкает за пределами меню? - PullRequest
9 голосов
/ 04 апреля 2011

Сначала стандартная информация:

VS2010 Ultimate
Win7 Ultimate 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;
        }
    }

Контекстное меню представляет собой WPF ContextMenu, встроенный в XAML. Значок уведомления на панели задач является значком уведомления форм (я не знаю родного значка уведомления WPF). Поэтому свойство notifyicon.ContextMenu не используется. Код выше работает нормально. Когда пользователь щелкает правой кнопкой мыши значок уведомления, контекстное меню отображается так, как должно.

Проблема, с которой я столкнулся, заключается в том, чтобы заставить ContextMenu уходить, когда я захочу. Он уходит нормально, если вы нажмете где-нибудь в приложении WPF. Такое поведение автоматическое. Но если пользователь щелкает в другом месте, например на панели задач, меню не исчезает. События «LostFocus» не срабатывают, потому что эти типы событий срабатывают, только когда элемент теряет фокус на другой элемент в том же приложении. Что касается приложения, ContextMenu никогда не теряет фокус. «Деактивировано» было еще одним событием, которое я пытался использовать. Здесь я должен уточнить, что приложение имеет опцию «Закрыть в трей», поэтому приложение может закрыть и запустить деактивированное событие, прежде чем пользователь сможет щелкнуть правой кнопкой мыши и показать меню. Приложение не активируется при появлении меню, поэтому деактивированное даже не сработает при нажатии на панель задач.

Итак, наконец, вопрос. Как заставить мое контекстное меню исчезать, когда пользователь щелкает по нему, даже если место, где пользователь щелкает, отсутствует в приложении, которое создало контекстное меню?

1 Ответ

0 голосов
/ 04 апреля 2011

Я не знаю, является ли это приемлемым вариантом, но если вы переключитесь на эту библиотеку , у вас будет хорошо интегрированный значок в трее для WPF без таких проблем (там есть пример кода для ContextMenus, какхорошо)

...