Как установить wpf messagebox.owner в окно рабочего стола, потому что Splashcreen закрывает Messagebox

StackOverflow https://stackoverflow.com/questions/576503

  •  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 дважды. По -видимому, проблема только влияет на первый показанный модальный диалог. Таким образом, вы можете просто позвонить в свой модальный диалог дважды, если вы не возражали против вспышки первого открытия и закрытия.

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

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

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-creen-dismisses-dialog-box

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

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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top