2011-04-27 172 views
2

當我向Canvas添加很多項目時,UI爲什麼會凍結?假設我有一個從1到1000的循環。所有1000個元素都添加後,我只能看到所有元素。爲什麼Canvas不顯示項目,因爲它們一次添加或刪除一個項目?如何阻止用戶界面凍結?

我能做些什麼來達到這種效果?我想爲元素添加動畫,因爲它們一次添加到Canvas中。但是由於界面剛剛凍結,動畫並未顯示出來。

感謝提前:)

+1

您可能會發現可以回答這個問題不太相關:http://stackoverflow.com/questions/4188766/how-do-i-block-access-to-a-method-until-animations-are -complete/4199546#4199546 – AnthonyWJones 2011-04-27 12:00:22

回答

1

也許你可以使用一個計時器,並添加每個刻度元素的數量較少?這可以讓你確保在每次添加之間進行一些刷新。

在有很多在畫布上的形狀的一個項目,我發現這是很有幫助的預分配,並在開始添加所有的形狀,然後只需撥動自己的知名度。我不知道這是普遍有用的或只是特定於。

+0

由於我添加了1000個項目,計時器會嚴重影響性能。沒有計時器也需要4-5秒才能建立起來。定時器會惡化情況。我可能會刪除動畫而不是性能瓶頸。 – TCM 2011-04-28 15:03:22

0

您的代碼被UI線程(即更新屏幕在同一線程)上執行的情況下,我是。因此,當您執行任何計算密集型操作時,您的UI將凍結。長時間運行的操作必須在單獨的線程中運行,以便應用程序保持響應。開始一個新的線程,並從你的線程中迭代你的循環並實例化你的對象。將對象添加到畫布上,你將不得不使用一個Dispatcher確保代碼部分UI線程上運行。

MyElement element = new MyElement(); 
Dispatcher.BeginInvoke(() => AddElementToCanvas(element)); 
+0

應該使用什麼線程來創建MyElement的實例?當有大量的UI操作達到目標時,你實在別無選擇,只能在UI線程上執行它們。 – AnthonyWJones 2011-04-27 11:52:31

+0

您必須提前實例化項目並將它們存儲在列表中。然後,您可以將項目分派到其他線程中的畫布上。即 DoWork的的doWork =委託(詮釋J) { Canvas.Children.Add(矩形[J]); }; 螺紋的WorkerThread =新主題(新的ThreadStart(()=> { 對(INT I = 0; I <1000;我++){ Dispatcher.BeginInvoke(的doWork,I); Thread.sleep代碼(100); } })); workerThread.Start(); – Steve 2011-04-27 14:37:27

相關問題