Сделать окно WPF вести себя как контекстное меню (показать / скрыть его правильно)

Я хочу сделать окно WPF, которое ведет себя как контекстное меню.

Так, например, когда я показываю окно wpf, я хочу, чтобы оно было самым верхним окном, и оттуда, если пользователь щелкает что-либо за пределами этого окна, я хочу, чтобы окно снова было скрыто.

До сих пор я пробовал немало техник, но единственная, что я нашел, что-то вроде работы, показана здесь. Это работает в самый первый раз, но никогда после этого:

public TheWindow()
{
    InitializeComponent();
    this.Topmost = true;
}

void ShowMe()
{
    this.Show();
    this.CaptureMouse();
}

void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
    /// TODO: Check if they clicked outside the window here!
    this.ReleaseMouseCapture();
    this.Hide();
}

Я также попытался обработать событие «Деактивировано», но по какой-то причине оно работает только в первый раз.

11.12.2008 21:28:15
2 ОТВЕТА
РЕШЕНИЕ

Разве PopUp не достаточно для ваших нужд? У него есть свойство StaysOpen, которое позволяет ему действовать так, как вы описываете.

3
11.12.2008 21:37:54
Вы не сможете установить фокус в этом всплывающем окне и не сможете перемещаться по нему с помощью клавиатуры.
Alexandru Dicu 6.03.2020 22:11:55

Не знаю, насколько это будет полезно, но если вам не обязательно использовать Window, я использовал одну из техник - размещение UserControl внутри Window.

В зависимости от каких-либо условий вы бы отобразили контекстное меню. Внутри меню я поместил пункт меню, а внутри него просто поместил пользовательский элемент управления. Он будет вести себя точно так, как вы хотите. Вы можете отобразить контекстное меню в любом месте экрана, щелкнув за пределами его границ, вы закроете его.

См. Http://andyonwpf.blogspot.com/2006/10/dropdownbuttons-in-wpf.html для примера того, как можно показать контекстное меню в любом месте экрана. Кроме того, вам нужно будет переопределить шаблон по умолчанию для MenuItem, чтобы при наведении курсора на элемент меню он не выделялся.

1
11.12.2008 21:49:13