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"));