Как "скрыть ()" модальное окно 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();
}

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


  1. чтобы показать модальное окно, всегда используйте ShowDialog().

  2. использовать Close() вместо Hide().

  3. обработки 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)