我想创建一个控件,需要一段时间来创建(Pivot),然后将其添加到可视化树中。为了做到这一点,我需要在将控件添加到VisualTree之前更改控件的调度程序(及其heirachy)。我可以更改WPF中控件的线程相关性(调度程序)吗?
这可能吗?是否有任何影响行走控制树和通过反射设置_dispatcher字段?
我想创建一个控件,需要一段时间来创建(Pivot),然后将其添加到可视化树中。为了做到这一点,我需要在将控件添加到VisualTree之前更改控件的调度程序(及其heirachy)。我可以更改WPF中控件的线程相关性(调度程序)吗?
这可能吗?是否有任何影响行走控制树和通过反射设置_dispatcher字段?
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,虚拟化/数据虚拟化:
仅加载和显示当前对其他用户可见的数据项目的可视项目。不要加载和显示滚动到屏幕外的可视项目,以便看到或以任何其他方式对用户不可见。在用户交互卸载变得可视的项目时,加载变得可见的项目。
要回答你的问题,我想它是可能使用反射来设置_dispatcher,但我不会推荐它。 WPF中有一个根深蒂固的线程关联和STA概念,所以我不会搞砸这个。
bitbonk的方法是一个很好的方法。 我们在我们的项目中使用的另一种方法是创建第二个UI线程,并在第一个UI线程构建UI时由第二个UI线程渲染进度指示器。只要进度条停留在第二个UI线程拥有的可视化树中,就应该很好。
只有在您控制正在构建的控件时才有效。我们正在研究如何使商业Pivot控件更具响应性,或者至少受另一个线程控制。 – 2010-09-20 09:45:47
不,上面的代码也可以是您的数据透视控件的**部分**。将多个子项添加到Pivot(从绑定的数据)中。 – bitbonk 2010-09-20 16:28:04
已经标记为答案,我已经尝试了很多黑客,似乎没有任何工作。当子项目被添加时,枢轴控件不是我们要控制的。我们可以尝试向区块中的ItemSource枚举中添加 – 2010-09-27 15:46:17