Force MessageBox будет находиться поверх окна приложения в .net/WPF

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

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

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

Ответы

Ответ 1

Используйте версию 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, в этом случае ваш код потока будет продолжать выполняться, но поток UI будет блокироваться на MessageBox до его отклонения).

Ответ 2

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

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

Ответ 3

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

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