显示progressBar直到window.show()

时间:2013-02-06 15:04:09

标签: wpf progress-bar

我在加载窗口时显示进度条有问题。 实际上我在datagrid中有很多项目的窗口。 当我调用window.Show()时,它需要很长时间才能打开,所以我想知道,如果它可以调用类似的东西:

 ShowProgressBar spb = new ShowProgressBar();
            spb.Topmost = true;
            spb.Owner = this.Owner;
            spb.Show();

            while(mainWin.isLoaded)
                  spb.updatePB(); // this method updating progressbar.value.
mainWindow.Show();

但是它根本没有显示progresbarr,只是在加载时才显示窗口满载时显示。

有什么有用的代码吗? ;)

2 个答案:

答案 0 :(得分:1)

您的问题是它们都在UI线程上,因此在完成加载MainWindow之前,您将无法更新进度条的UI。解决方案是使用另一个线程来更新ProgressBar的UI ....

这样的事情应该有效:

 Dispatcher progressDisptacher;
 var uiThread = new Thread(() =>
  {
      ShowProgressBar spb = new ShowProgressBar();
      spb.Topmost = true;
      spb.Show();
      progressDisptacher = spb.Dispatcher;

      // allowing the main UI thread to proceed 
     System.Windows.Threading.Dispatcher.Run();
   });
   uiThread.SetApartmentState(ApartmentState.STA);
   uiThread.IsBackground = true;
   uiThread.Start();

   mainWindow.Show();
   progressDisptacher.BeginInvokeShutdown(DispatcherPriority.Send);

如您所见,在加载mainWindow之后,您可以使用以下命令终止进度条线程: progressDisptacher.BeginInvokeShutdown(DispatcherPriority.Send);

答案 1 :(得分:0)

我假设您要在未加载主窗口时更新进度条。所以首先你应该想要反转while循环。

然而它的单一问题更为微妙。

欢迎来到STA线程的极其痛苦的工作。一个快速的经验法则是,任何与您在屏幕上看到的内容有关的事情都必须使用主线程完成。事实上,很多事情发生在你不使用主线程时,.net使用它重绘任何已经改变的东西(比如进度条)。

为了能够显示进度条,您必须将UI线程的控制权返回到所谓的消息循环。最简单的方法是返回方法调用。但在此之前,您需要设置一个计时器来定期检查进度。

您当前的代码只会花一整天时间来检查mainWindow是否已加载,而不是实际加载mainWindow。

然而,mainWindow的实际加载可能会再次需要使用主线程来构造。

Soooo ......最后你应该将IsAsync输出到将数据加载到数据网格中的绑定。