当我从异步方法中显示消息框时,新消息框的z顺序可能是错误的, 并且用户可能会错过该框。
考虑以下代码:
C
运行此应用程序,单击ShowMessage-Button并激活一些其他窗口。 显示该消息时,它可以出现在背景中。 由于它正确地阻止了与主窗口的交互,因此对于用户来说,该应用程序似乎已挂起。
我知道,可以通过向private async void btnShowMessage_Click(object sender, EventArgs e)
{
await Task.Delay(3000);
MessageBox.Show("Test");
}
方法显式提供所有者来防止这种情况。
无论如何,我想知道是否存在针对该问题的更通用的解决方案
(实际上,我期望Show()
处理此问题。)
答案 0 :(得分:1)
根据MessageBox.Show的源代码。 https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/MessageBox.cs,451867ccabfb0df5
未分配所有者时,它将使用不安全的方法获得活动窗口(因此,在等待3000毫秒后,活动窗口可能是您的应用程序,其他应用程序甚至台式机)。 因此最好分配所有者。
如果未以同步方式调用异步方法,则异步方法中的代码将不会在UI线程上运行。现在允许访问UI元素(DependencyObject,在您的情况下不是),您也应该使用Dispatcher。
您可以在这里找到答案:
Force MessageBox to be on top of application window in .net/WPF