MessageBox в асинхронном методе показан с неправильным z-порядком - PullRequest
0 голосов
/ 12 сентября 2018

Когда я показываю окно сообщения из асинхронного метода, z-порядок нового окна сообщения может быть неправильным, и пользователь может пропустить это поле.

Рассмотрим следующий код:

private async void btnShowMessage_Click(object sender, EventArgs e)
{
    await Task.Delay(3000);
    MessageBox.Show("Test");
}

Запустите это приложение, нажмите кнопку ShowMessage и активируйте другое окно.Когда сообщение отображается, оно может появиться в фоновом режиме.Поскольку он правильно блокирует взаимодействие с главным окном, пользователю кажется, что приложение зависает.

Я знаю, что этого можно избежать, явно указав владельца для Show() -метода.В любом случае, мне было интересно, есть ли более общее решение этой проблемы (на самом деле я ожидал, что ExecutionContext справится с этим).

1 Ответ

0 голосов
/ 12 сентября 2018

Согласно исходному коду MessageBox.Show. https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/MessageBox.cs,451867ccabfb0df5

Когда владелец не назначен, он получит активное окно небезопасными методами (поэтому активным окном после 3000 мс ожидания может быть ваше приложение, другие приложения или даже рабочий стол). Так что лучше назначить владельца.

Если асинхронные методы не вызываются синхронно, код в асинхронном методе не будет выполняться в потоке пользовательского интерфейса. Доступ к элементам пользовательского интерфейса (DependencyObject, не в вашем случае) теперь разрешен, вам также следует использовать Dispatcher.

Вы можете найти свой ответ здесь:

Заставить MessageBox находиться в верхней части окна приложения в .net / WPF

...