Заставить MessageBox быть поверх окна приложения in.net/WPF

в моем приложении WPF я иногда бываю System.Windows.MessageBox. Когда он первоначально отображается, он отображается поверх моего главного окна приложения, как я хотел бы. Есть ли способ заставить его всегда оставаться в верхней части главного окна? Проблема у меня в том, что когда , затем пользователи могут нажать на главное окно приложения и вывести его на передний план, что означает MessageBox становится скрытым из вида. В этом случае пользователь может не понимать, что он есть, или забыть об этом, и для них основное приложение, похоже, заморожено.

Я прочитал несколько тем об этом, но никто не решил проблему для меня.

Я должен добавить, что нить расклеивание MessageBox может не быть потоком пользовательского интерфейса. Спасибо Тома

3 ответов


используйте версию MessageBox.Show это берет окно "владелец" и передает ваше окно.

MessageBox.Show(Application.Current.MainWindow, "Im always on top - of the main window");

если возможно, не в потоке пользовательского интерфейса, попробуйте:

string msg="Hello!";
if (Application.Current.Dispatcher.CheckAccess()) {
    MessageBox.Show(Application.Current.MainWindow, msg);
}
else {
    Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(()=>{
        MessageBox.Show(Application.Current.MainWindow, msg);
    }));
}

вы можете:
1. Invoke заблокировать поток до MessageBox уволен или
2. BeginInvoke в этом случае ваш код потока будет продолжать выполняться, но поток пользовательского интерфейса будет блокировать MessageBox пока его не уволили).


это быстрый способ поместить окно сообщения поверх окон приложения.

MessageBox.Show(this ,"Output text"));


внутри "public partial class MainWindow : Window" поместите следующий код. Таким образом, вызов будет запускать ваш код внутри потока UI.

void ShowErrorMessage(ERROR err)
{
    this.Dispatcher.Invoke((Action)(() =>
    {
        MessageBox.Show(err.description, err.code.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
    }));
}