2013-04-28 63 views
1

我必須呈現大約10'000個wpf控件,並且我不想在此操作期間凍結我的應用程序。是否有可能在另一個線程中執行?在後臺線程中創建wpf控件

我試圖用

myStackPanel.Dispatcher.BeginInvoke(
    System.Windows.Threading.DispatcherPriority.SystemIdle, 
    new NextPrimeDelegate(this.AddButton)); 

與調度員的另一個變種。但它總是凍結我的應用程序。我想在創建百個控件時顯示動畫等待畫面,但它總是凍結,因爲它是調度程序的線程。

感謝您的幫助 Andrew。

+0

我不認爲你可以在不同的線程上創建控件。所有WPF元素初始化應該位於主STA線程上。但是,你爲什麼要創建這麼多的控​​件?您應該爲這種情況使用某種UI虛擬化。 – jure 2013-04-28 19:11:01

+3

請詳細說明爲什麼您必須創建10.000控件。認爲應該有一些替代方案。如果它對你有幫助,請查看本文:http://blogs.microsoft.co.il/blogs/tomershamam/archive/2009/09/06/ui-virtualization-vs-data-virtualization.aspx – 2013-04-28 19:12:27

+0

@MareInfinitus ,上面的鏈接已經死了。 – 2014-08-25 08:18:51

回答

4

必須在與調度程序相關聯的線程上創建WPF控件,它們將在其中呈現。對Dispatcher.BeginInvoke的調用會調度指定的操作,以便稍後在調度程序線程上運行,而不是在後臺線程上運行。

如果您有很多UI控件要創建並且想在創建過程中顯示動畫,那麼您需要將要完成的工作分割爲可以快速處理的小單元。然後您可以以低於正常的優先級調用BeginInvoke來分別處理每個工作組單元。

事實上,您需要創建10,000個控件是極端的,您應該研究虛擬化控件。