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