c# - 第二个 Window.Show 后标签未显示

标签 c# wpf

我正在修复一个已经存在的应用程序,但遇到了一些奇怪的问题。

在我们 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/

相关文章:

c# - 异步任务以中文字符而不是可读文本输出

c# - 分析一个用 C++ 编码的 OpenGL 2.0 游戏,入口项目在 C# 中,所有这些都在 visual studio 2010 中?

c# - 如何向 Canvas 元素添加多条折线?

c++ - 获取第三方Click-Once应用的config文件夹

wpf - ListBox.SelectedItems 的双向手动绑定(bind)实现?

c# - 使用 WPF 自定义控件,如何为我的自定义控件命名以通过后面的代码访问它?

c# - Watin DialogHandler 关闭 SaveFileDialog

c# - Linux 和 Windows 中的单声道

c# - 通过在文本框中键入内容来过滤列表框的集合 ViewSource

wpf - 如何将一个资源(SolidColorBrush)指向另一个资源