加载第二个窗口没有先停止

时间:2017-08-04 10:29:35

标签: c# wpf multithreading

我有一个按钮可以打开第二个窗口,但第二个窗口在显示之前需要进行一些处理。在第二个屏幕出现之前,我不想让初始窗口死掉,而是想通知用户正在进行处理。我对如何做到这一点的想法;

1)在第二个线程中调用第二个窗口,让第一个窗口中的UI显示" Loading"等,一旦第二个窗口完成,将指示器传递给第一个窗口,停止显示"正在加载"。

我已经阅读了一些关于调度员的信息。 beginInvoke但仍然有点努力让这个工作。我正在尝试这个,在我的Window1初始化程序中,我有thread.Sleep只是为了测试我的mainWindow仍在工作,但事实并非如此。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

您无法在工作线程上打开窗口并执行其他UI任务。所有这些活动都必须在主线程上执行。您可以通过从后台线程调用调度程序来执行此操作:

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    // First do the work
    Thread.Sleep(...);
    // Then show the window
    Application.Current.Dispatcher.Invoke(() => window1.Show());
}

使用这种简单的方法,您可以快速掌握事件处理程序中的调度程序,随着应用程序的增长,您可能希望使用例如各种MVVM框架切换到更严格的编程模型。

从UX角度来看,最好立即显示第二个窗口,然后显示进度条或微调器,指示正在执行工作。然后,当工作完成后,隐藏此指示器并显示工作结果。使用调度程序从后台线程更新UI的原则仍然适用。