0

我在加载窗口时显示进度条有问题。实际上,我在数据网格中有很多项目的窗口。当我调用 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,在加载时,只在窗口满载时显示。

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

4

2 回答 2

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);

于 2013-02-06T15:19:26.140 回答
0

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

然而,它有点微妙的单一问题。

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

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

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

但是mainWindow的实际加载很可能会再次需要使用主线程来构造。

Soooo ...最后,您应该 IsAsync 将项目加载到数据网格中的绑定。

于 2013-02-06T15:26:25.417 回答