Как "скрыть ()" модальное окно WPF без его закрытия?
у меня есть WPF окно, которое запускается в фоновом потоке, как своего рода "окно оповещения"... при возникновении события отображается сообщение... пользователь нажимает кнопку "повтор", и я вызываю this.Visibility = Visibility.Collapsed
тот самый момент, когда я скрываю окно (либо по телефону this.Hide() или задание Visibility Как уже упоминалось выше)... код "ShowDialog ()" освобождает окно и закрывает его.
Это абсолютно ошибка в коде WPF (который я идентифицировал через reflector)... но мой вопрос остается открытым. Кто-нибудь смог придумать обходной путь для этой проблемы?
Я пробовал много вещей, и теперь я обращаюсь к вам умные люди:)
4 ответов
вы не можете скрыть модальный диалог. Это как спросить: "как мне добраться до 100mph в обратном направлении?"Нет, ты ведешь машину вперед.
используйте Show, а не ShowDialog. В качестве альтернативы вы можете просто повторно ShowDialog, когда он должен стать видимым снова.
ответ Тимоти хорош. Мне просто нужно было для моего 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();
}
мне нужно было сделать это, потому что он висел на ходу после того, как форма была действительно закрыта.
чтобы показать модальное окно, всегда используйте
ShowDialog().использовать
Close()вместоHide().обработки
FormClosingсобытие вроде этого:
private void OnFormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
this.Visible = false;
}
хорошо, и так быстро, как это - мой босс (старый Тупой парень C++, что он) понял ответ.
здесь был код внутри моего фонового потока (который установлен в режим 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();
и это все.
эта вещь заставляет меня ненавидеть людей C++, хотя и заставляет меня просто сказать: "если вы только что построили его прямо в первую очередь я не придется искать обходной путь!"(j / k)