2012-03-08 63 views
0

在我的程序中,有一個地圖編輯器,從數據庫加載信息後,我需要生成一些自定義控件(取決於地圖的6000-10000)。不幸的是,它鎖定了用戶的屏幕10-20秒。UI強化應用程序

我該如何使用延遲加載?我怎樣才能沒有崩潰和鎖定屏幕?

回答

2

這個問題是廣泛的。但我可以給你一些提示。首先,我很肯定你不需要這麼多的自定義控件。考慮用戶擁有多少輸入設備,他不能與同時與多個控件進行交互。所以你可以用幾種不同的方式「欺騙」這些控件。例如,顯示控件的圖像,並在用戶開始與其交互時切換它。 另一件事是,你不需要你看不到的東西。如果只有10個元素適合屏幕,爲什麼要創建10000個元素的列表?沒有理由,這就是爲什麼有辦法緩解這種情況,一種叫做Virtualization,可以通過多種方式完成。您可以使用UI虛擬化,推遲加載ui組件或使用數據虛擬化。另一件事,與數據虛擬化合作是使用線程或後臺工作人員來處理大量數據的負載。批量創建數據以提供UI線程時間來處理窗口消息。

+0

這些控件中的大多數都具有圖像,並且都在畫布內.. 所示爲顯示在屏幕上的地圖,不幸的是您必須查看整個地圖,但正如你所說,也許我可以刪除他當然沒有使用的其他信息,或嘗試某種形式的虛擬化。 – 2012-03-08 18:03:12

+0

您只有一定數量的像素,當向用戶顯示數據時,您可以並且通常必須始終僞造和作弊。看看谷歌地圖,例如,他們沒有一個巨大的形象,他們巧妙地重新加載和緩存。像這樣的事情也可能是你的一種方式。 – dowhilefor 2012-03-08 18:37:51

+0

我在我的應用程序中發現了大問題。遞歸地在另一個畫布內封裝一個畫布..它真的很重,我正在改變操作.. – 2012-03-12 18:27:33

0

使用TPL(任務並行庫)做一個單獨的線程的DB任務......它看起來像這樣:

Task.Factory.StartNew(() => MyLongRunningMethod)); 

檢查CodeProject上了this偉大的文章,在獲取更多信息......

編輯:如下所述,原始答案意味着某種控制方式可以在單獨的線程上生成,但實際上作爲可視化樹的一部分,因此必須在UI線程上生成控件,以便不是有效建議...

編輯:沒有看到它將如何在符號屏幕上適應10000個自定義控件,因此必須有一種方法來使用某種類型的虛擬化架構,其中只有可見控件會生成,而其餘控件會得到根據需要生成...

+0

這似乎是一個很好的解決方案,感謝分享。 – 2012-03-08 18:14:09

+0

np,很高興我可以幫助... – 2012-03-08 18:19:09

+0

不幸的是,我還沒有找到一種方法來使用任務來創建和管理可視組件... – 2012-03-12 18:18:18