我正在修复一个已经存在的应用程序,但遇到了一些奇怪的问题。
在我们 GUI 的某些部分,我们的操作需要一些时间。所以我们创建了一个名为 Wait
的小窗口,其中包含一条简单的消息 Please wait...
。我们只需在需要时显示/隐藏
窗口即可。
但是问题来了。第二次显示窗口时,Please wait...
Label
没有显示。
Wait.xaml:
<Window x:Class="WpfApplication1.Wait"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Wait" SizeToContent="WidthAndHeight">
<StackPanel>
<Label>Please wait...</Label>
</StackPanel>
</Window>
Wait.xaml.cs
public partial class Wait : Window
{
public Wait()
{
InitializeComponent();
}
}
最后我只是在一个最小的 WPF 应用程序中尝试这个:
// The window is shown perfectly
m_WaitWindow.Show();
Thread.Sleep(5000);
m_WaitWindow.Hide();
Thread.Sleep(2000);
// The label is not shown, the window is empty
m_WaitWindow.Show();
Thread.Sleep(5000);
m_WaitWindow.Hide();
我不知道如何解决这个问题,我在 Show
之后尝试了很多东西,比如 UpdateLayout
但没有效果。
不仅仅是关于如何解决这个问题的答案,我还想了解为什么会这样?
最佳答案
正如 Hans Passant 所说,您应该在 UI 线程以外的单独线程上执行长时间运行的工作。如果您真的坚持在主线程上执行此操作,解决方法通常是调用类似 Application.DoEvents()
的方法。此调用在 WPF 中不存在,因为它是一种 hack,表明您在 UI 线程上做了太多工作。但是,如果您真的必须尝试完成此操作,您可以在第二次显示窗口后立即添加此行:
Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { }));
它与 Application.DoEvents()
基本相同,但有一些小的怪癖。然而,更好的解决方案是启动一个 BackgroundWorker
来执行长时间运行的过程,同时 UI 保持事件状态。更多信息 here .
关于c# - 第二个 Window.Show 后标签未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18768421/