我在加载窗口时显示进度条有问题。 实际上我在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,只是在加载时才显示窗口满载时显示。
有什么有用的代码吗? ;)
答案 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输出到将数据加载到数据网格中的绑定。