2011-07-27 137 views
2

如果我理解正确地更改WPF中的任何控件(例如Label的文本),将在Dispatcher中排队更新。分派器等待我的代码完成,并等待它处理整个队列。WPF - 同步UI更新

为此,主叫

double current = 0; 
ReportProgress (0d, "ProcessingStarted"); 
foreach (var item in collection) 
{ 
     item.Process(); //takes about 10s 
     current++; 
     ReportProgress (current/(double)collection.Count, "Processing item No. " + current.ToString() + " finished"); 
} 
ReportProgress (1d, "Finished"); 

其中ReportProgress调用一个事件与该事件处理程序

private void handlerProgressMade (object sender, ProgressEventArgs e) 
{ 
    pbProgress.Value = pbProgress.Maximum * e.Percent; 
    lbProgressMessage.Content = e.Message; 
} 

全进度和“完成”显示的消息结束,但intersteps未示出。

我知道它可以通过调用不同线程中的函数和异步更新UI(它将在某个时刻发生)来完成,但是现在添加线程看起来像是不必要的复杂化。

如何强制分派器立即更新和重绘?

+0

我觉得你没有其他选择让它工作,你必须去线程......如果有工作,没有人会去线程..下面的链接可能会帮助你实现线程http://bathinenivenkatesh.blogspot .com/2011/07/wpf-build-more-responsive-ui.html – Bathineni

+0

@bathineni我知道这可以通过线程完成。如果用户界面正在回应,这并不重要,只要报告进度就没有问题。 – Lukas

+1

@Lukas ..可能是我错了..但对我来说,报告进展只是UI响应 – Bathineni

回答

0

,如果你不想使用后台线程,然后前后设置进度条价值,Application.DoEvents()老黑客可能会帮助,因为它会等待明确的是,得到了在GUI消息总线

堆放的所有消息队列
+0

System.Windows.Forms.Application.DoEvents(); (在wpf应用程序中感觉不对)使最终更新速度下降到一定的水平,我可以看到所有状态在完成时都会闪现,但当我要求更新ui时无处可去。 – Lukas

+0

你认为这将有助于:http://dedjo.blogspot.com/2007/08/how-to-doevents-in-wpf.html? –