我有一个按钮可以打开第二个窗口,但第二个窗口在显示之前需要进行一些处理。在第二个屏幕出现之前,我不想让初始窗口死掉,而是想通知用户正在进行处理。我对如何做到这一点的想法;
1)在第二个线程中调用第二个窗口,让第一个窗口中的UI显示" Loading"等,一旦第二个窗口完成,将指示器传递给第一个窗口,停止显示"正在加载"。
我已经阅读了一些关于调度员的信息。 beginInvoke但仍然有点努力让这个工作。我正在尝试这个,在我的Window1初始化程序中,我有thread.Sleep
只是为了测试我的mainWindow仍在工作,但事实并非如此。任何帮助将不胜感激。
答案 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的原则仍然适用。