异步方法中的MessageBox显示错误的z-Order

问题描述 投票:0回答:1

当我在异步方法中显示消息框时,新消息框的z-Order可能是错误的,并且用户可能会错过该框。

请考虑以下代码:

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

运行此应用程序,单击ShowMessage-Button并激活一些不同的窗口。显示消息时,它可以显示在后台。由于它正确地阻止了与主窗口的交互,因此用户似乎挂起了应用程序。

我知道,这可以通过明确地向Show()方法提供所有者来防止。无论如何,我想知道是否有一个更通用的解决方案来解决这个问题(实际上,我希望ExecutionContext能够解决这个问题)。

c# asynchronous async-await
1个回答
1
投票

根据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

© www.soinside.com 2019 - 2024. All rights reserved.