Как установить wpf messagebox.owner в окно рабочего стола, потому что Splashcreen закрывает Messagebox
-
05-09-2019 - |
Вопрос
Я использую Заставка Особенность в WPF, установив растровое изображение Построить действие к брызганию. За экраном Splash информация о лицензировании проверяется, и если она не удастся, я покажу Окно сообщения.
Согласно этому Обратная связь, Это потому, что MessageBox.Owaler - это экран брызг, и как только открывается другое окно, даже если это Avallybox, окно экрана Splash закрыто, что, в свою очередь, закрывает Messagebox, поэтому пользователь никогда не видит Messagebox.
Таким образом, обходной путь заключается в том, чтобы установить MessageBox.Owaler в другое окно, но это означало бы, что я должен создать экземпляр другого окна, которое может даже не понадобиться.
Можно ли установить MessageBox.Owaler в окно рабочего стола? И как, потому что единственная другая функция, которая приходит на ум, - это Getdesktopwindow () Функция API, но это возвращает ручку окон и MessageBox.Owaler - это окно WPF.
Решение 3
Я нашел проблему. Я также использую экраны встроенного брызга, который вызывает это: WPF Splashcreen закрывает Messagebox
Другие советы
Поскольку использование окна рабочего стола в качестве родителя для ваших модальных диалогов не является хорошей идеей, как указал @nir в своем ответе, вот три других обходных пути:
1) Используйте скрытое окно. Создайте крошечное, немодальное окно, чтобы выступить в качестве родителя для вашего Bessagebox или другого модального диалога. Этот подход описан здесь:
http://social.msdn.microsoft.com/forums/en-us/wpf/thread/116bcd83-93bf-42f3-9bfe-da9e7de37546/
2) Создайте немодальные окна сообщений. Измените режим запуска, чтобы явное выключение и используйте немодальное окно для отображения вашего сообщения. Этот подход описан в ответе на этот вопрос Stackoverflow:
MessageBox с деталями исключения сразу же исчезает, если используйте экран Splash в WPF 4.0
3) Вызов Messagebox дважды. По -видимому, проблема только влияет на первый показанный модальный диалог. Таким образом, вы можете просто позвонить в свой модальный диалог дважды, если вы не возражали против вспышки первого открытия и закрытия.
Лично мне не нравится ни один из этих обходных путей. Единственный другой вариант-избежать встроенной функциональности брызговика и переворачивать свой собственный с нуля. Вот ссылка, если вы хотите дальше исследовать этот маршрут:
http://social.msdn.microsoft.com/forums/en-us/wpf/thread/8dd49fd0-9cc9-43c6-b285-6f119ab8a32e/
Наконец, если вы так же раздражены этой проблемой, как и я, вы можете проголосовать за Microsoft, чтобы исправить эту ошибку здесь:
Я сам придумал это решение, так что, возможно, с этим что -то не так, но, похоже, это работает отлично:
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);
Вы можете опубликовать код? Я только что попытался добавить это в файл 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);
}
... и это работает, как и ожидалось (подсказка «Подтверждение старта» остается открытой, пока я не ответил, и если я нажму на «Нет», приложение отключается).
Окно рабочего стола никогда не является правильным родителем, прочитайте это, чтобы знать, почему:
http://blogs.msdn.com/oldnewthing/archive/2004/02/24/79212.aspx
Теперь проблема, описанная в этом посте, не происходит так много, потому что MS работал вокруг этого, в этом посте вы можете увидеть, как:
http://blogs.msdn.com/oldnewthing/archive/2006/11/02/931674.aspx
Это мне очень помогло ..... дал мне новую идею, но пример кода, который я видел здесь, требуется некоторая модификация
Вот простой пример в WPF с модификацией, теперь он работает
на кнопке нажмите
Вставьте этот код
if (system.windows.forms.messagebox.show ("ue uver", "delete", system.windows.forms.messageboxbuttons.yesno, system.windows.forms.messageboxicon.question) == system.windows.forms. Dialogresult.yes) {this.close (); } else {messagebox.show ("Почему не удалить"); }
Это не связано напрямую с ситуацией ОП, но может быть полезно для других, у которых проблемы с тем, что Messagebox скрыты за другими окнами в определенных особых ситуациях.
Как упоминает @Dthrasher, одним решением является использование скрытого фиктивного окна. Но иногда даже этого недостаточно. У меня была ситуация, когда решение заключалось в том, чтобы не только использовать скрытое фиктивное окно, но и включать его самое верхнее свойство всякий раз, когда я использовал его с MessageBox.
_formKludge.TopMost = true;
MessageBox.Show(_formKludge, "Nice informative message.", "Super-duper Program",
MessageBoxButtons.OK, MessageBoxIcon.Error);
_formKludge.TopMost = false;