как установить wpf MessageBox.Owner в окно рабочего стола, потому что SplashScreen закрывает MessageBox - PullRequest
9 голосов
/ 23 февраля 2009

Я использую функцию SplashScreen в WPF, установив для растрового изображения Построить действие значение Splashscreen. За заставкой проверяется информация о лицензировании, и в случае неудачи я показываю MessageBox .

Согласно этому Feedback , это потому, что MessageBox.Owner является заставкой, и как только открывается другое окно, даже если это MessageBox, окно заставки закрывается, а затем закрывается. MessageBox, поэтому пользователь никогда не видит MessageBox.

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

Можно ли установить MessageBox.Owner на окно рабочего стола? И как, потому что единственная другая функция, которая приходит на ум, это функция GetDesktopWindow () api, но она возвращает дескриптор окна, а MessageBox.Owner является окном WPF.

Ответы [ 7 ]

9 голосов
/ 01 июня 2012

Я сам придумал это решение, так что, возможно, с ним что-то не так, но, похоже, оно отлично работает:

Window temp = new Window() { Visibility=Visibility.Hidden };
temp.Show();
MessageBox.Show(temp, "An error occurred before the application could start.\n\nTechnical Details: " + ex.Message, "Fatal Error", MessageBoxButton.OK, MessageBoxImage.Stop);
App.Current.Shutdown(1);
9 голосов
/ 16 марта 2011

Поскольку использование окна рабочего стола в качестве родительского для ваших модальных диалогов не является хорошей идеей, как указал @Nir в своем ответе, здесь есть три других обходных пути:

1) Используйте скрытое окно. Создайте крошечное немодальное окно, которое будет выступать в качестве родителя для вашего MessageBox или другого модального диалога. Этот подход описан здесь:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/116bcd83-93bf-42f3-9bfe-da9e7de37546/

2) Создание немодальных окон сообщений. Измените режим запуска на явное отключение и используйте немодальное окно для отображения вашего сообщения. Этот подход описан в ответе на вопрос StackOverflow:

MessageBox с деталями исключения немедленно исчезает, если использовать заставку в WPF 4.0

3) Дважды вызовите MessageBox. Очевидно, проблема касается только первого показанного модального диалога. Так что вы можете просто вызвать свой модальный диалог дважды, если не возражаете против вспышки первого открытия и закрытия.

https://connect.microsoft.com/VisualStudio/feedback/details/600197/wpf-splash-screen-dismisses-dialog-box

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

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8dd49fd0-9cc9-43c6-b285-6f119ab8a32e/

Наконец, если вы так же раздражены этой проблемой, как и я, вы можете проголосовать за Microsoft, чтобы исправить эту ошибку здесь:

http://connect.microsoft.com/VisualStudio/feedback/details/600197/wpf-splash-screen-dismisses-dialog-box

4 голосов
/ 23 февраля 2009

Я нашел проблему. Я также использую встроенную заставку, которая вызывает это: WPF SplashScreen закрывает MessageBox

1 голос
/ 24 февраля 2009

Окно рабочего стола никогда не является правильным родителем, прочитайте это, чтобы узнать почему:

http://blogs.msdn.com/oldnewthing/archive/2004/02/24/79212.aspx

Теперь проблема, описанная в этом посте, не возникает так часто, потому что MS обошла ее, в этом посте вы можете увидеть, как:

http://blogs.msdn.com/oldnewthing/archive/2006/11/02/931674.aspx

1 голос
/ 23 февраля 2009

Можете ли вы опубликовать код? Я только что попытался добавить это в файл App.xaml.cs в новом приложении WPF:

protected override void OnStartup(StartupEventArgs e)
{
    if (MessageBox.Show("Start app?", "Confirm Start", 
        MessageBoxButton.YesNo) == MessageBoxResult.No)
    {
        this.Shutdown();
        return;
    }

    this.StartupUri = new Uri("Window1.xaml", UriKind.Relative);
    base.OnStartup(e);
}

... и он работает как положено (приглашение «Подтвердить запуск» остается открытым до тех пор, пока я не отвечу, и если я нажму «Нет», приложение закроется).

0 голосов
/ 22 марта 2014

Это не имеет прямого отношения к ситуации ОП, но может быть полезно для других, у которых возникают проблемы с скрытием MessageBox за другими окнами в определенных особых ситуациях.

Как упоминает @dthrasher, одним из решений является использование скрытого фиктивного окна. Но иногда даже этого недостаточно. У меня была ситуация, когда решением было не только использовать скрытое пустое окно, но и включать его свойство TopMost всякий раз, когда я использовал его с MessageBox.

     _formKludge.TopMost = true;

     MessageBox.Show(_formKludge, "Nice informative message.", "Super-duper Program",
                     MessageBoxButtons.OK, MessageBoxIcon.Error);

     _formKludge.TopMost = false;
0 голосов
/ 15 июля 2009

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

вот простой пример в wpf с модификацией сейчас работает

при нажатии кнопки

вставьте этот код

if (System.Windows.Forms.MessageBox.Show («уверены», «удалить», System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question) == System.Windows .Forms.DialogResult.Yes) { this.Close (); } еще { MessageBox.Show («почему бы не удалить»); }

...