2010-09-10 61 views

回答

0

AFAIK这只适用于Freezable派生类。我看到的最佳解决方案是在UI线程上创建控件,并在创建过程中显示进度条。为了使这成为可能,你将不得不创建控制部分,让进度条稍微更新一次。这不仅是进度条所必需的,而且还会确保您的应用程序不会阻止。

伪代码(以额外的线程execure):

this.Dispatcher.BeginInvoke(UpdateProgress(0)); 
this.Dispatcher.BeginInvoke(bigControlBuilder.Build(0,25)); 
this.Dispatcher.BeginInvoke(UpdateProgress(25)); 
this.Dispatcher.BeginInvoke(bigControlBuilder.Build(25,50)); 
this.Dispatcher.BeginInvoke(UpdateProgress(50)); 
this.Dispatcher.BeginInvoke(bigControlBuilder.Build(50,75)); 
this.Dispatcher.BeginInvoke(UpdateProgress(75)); 
this.Dispatcher.BeginInvoke(bigControlBuilder.Build(75,100)); 
this.Dispatcher.BeginInvoke(UpdateProgress(100)); 
this.Dispatcher.BeginInvoke(this.Children.Add(bigControlBuilder.GetControl())); 

更新:

为了使复杂的控制更加敏感,你也可以尝试UI,虚拟化/数据虚拟化:

仅加载和显示当前对其他用户可见的数据项目的可视项目。不要加载和显示滚动到屏幕外的可视项目,以便看到或以任何其他方式对用户不可见。在用户交互卸载变得可视的项目时,加载变得可见的项目。

+0

只有在您控制正在构建的控件时才有效。我们正在研究如何使商业Pivot控件更具响应性,或者至少受另一个线程控制。 – 2010-09-20 09:45:47

+0

不,上面的代码也可以是您的数据透视控件的**部分**。将多个子项添加到Pivot(从绑定的数据)中。 – bitbonk 2010-09-20 16:28:04

+0

已经标记为答案,我已经尝试了很多黑客,似乎没有任何工作。当子项目被添加时,枢轴控件不是我们要控制的。我们可以尝试向区块中的ItemSource枚举中添加 – 2010-09-27 15:46:17

0

要回答你的问题,我想它是可能使用反射来设置_dispatcher,但我不会推荐它。 WPF中有一个根深蒂固的线程关联和STA概念,所以我不会搞砸这个。

bitbonk的方法是一个很好的方法。 我们在我们的项目中使用的另一种方法是创建第二个UI线程,并在第一个UI线程构建UI时由第二个UI线程渲染进度指示器。只要进度条停留在第二个UI线程拥有的可视化树中,就应该很好。

相关问题