Как мне «Скрыть ()» модальное окно WPF без его закрытия? - PullRequest
10 голосов
/ 30 ноября 2010

У меня есть окно WPF, которое запускается в фоновом потоке как своего рода «окно уведомлений» ... при возникновении события отображается сообщение ... пользователь нажимает кнопку «Отложить», и я вызываюthis.Visibility = Visibility.Collapsed

В тот самый момент, когда я скрываю окно (либо вызывая this.Hide(), либо устанавливая Visibility, как указано выше) ... код "ShowDialog ()" освобождает окно и закрывает его.

Это абсолютно ошибка в коде WPF (который я определил с помощью рефлектора) ... но мой вопрос остается.Кто-нибудь смог найти способ обойти эту проблему?

Я много чего перепробовал и теперь обращаюсь к умным людям :)

Ответы [ 4 ]

5 голосов
/ 30 ноября 2010

Вы не можете скрыть модальное диалоговое окно. Это все равно, что спросить: «Как мне разогнаться до 100 миль в час?» Вы не, вы ведете машину вперед.

Используйте Show, а не ShowDialog. В качестве альтернативы вы можете просто повторно показать ShowDialog, когда он должен снова стать видимым.

2 голосов
/ 29 июня 2012
  1. Для отображения модального окна всегда используйте ShowDialog().

  2. Используйте Close() вместо Hide().

  3. Обрабатывать событие FormClosing так:

    private void OnFormClosing(object sender, FormClosingEventArgs e)
    {
        e.Cancel = true;
        this.Visible = false;
    }
2 голосов
/ 22 октября 2011

Тимоти ответ хорошо. Мне просто нужно, чтобы мой Scenerio добавил следующее

window.Closed += new EventHandler(window_Closed);
window.Show();
System.Windows.Threading.Dispatcher.Run(); 

, а затем в случае ...

void window_Closed(object sender, EventArgs e)
{
    System.Windows.Threading.Dispatcher.ExitAllFrames();
}

Мне нужно было сделать это, потому что оно зависало на Run после того, как форма была действительно закрыта.

0 голосов
/ 30 ноября 2010

ОК, и так же быстро, как мой начальник (старый тупой парень С ++, который он есть) понял ответ.

Здесь было кодом внутри моего фонового потока (который установлен в режим STA):

// Show dialog - keeps the thread open and shows the window! Yay!!!
new BeamUI.Notifier.NotifierWindow().ShowDialog();

А вот модификация, которая, как ни странно, прекрасно работает:)

// Show... hmm, that shows the window... but how do I keep this thread open?
new BeamUI.Notifier.NotifierWindow().Show();

// ZOMG - a line of code that JUST keeps the thread (and msgpump) going!!!
System.Windows.Threading.Dispatcher.Run();

И это все.

Однако, из-за этого я ненавижу людей на С ++ и хочу сказать: «Если бы вы только построили это правильно, мне не пришлось бы искать обходной путь!» (К / к)

...