我想創建一個控件,需要一段時間來創建(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