2009-06-08 32 views

回答

2

一個ObservableCollection可以完全像一個List一樣使用。但是,這將不利於加載圖像更快...

你應該做的是你的列表框綁定到包含圖像一個ObservableCollection,並在一個單獨的線程的圖像填充集合。通常不可能從另一個線程修改綁定集合,但是我寫了一個可以處理這個問題的類AsyncObservableCollection

1

只需將您的圖像轉換成一個ObservableCollection不會神奇地讓他們加載速度更快。可能需要這麼長時間的是從磁盤加載圖像數據。您應該將其移至後臺線程,以便加載圖像數據時不會掛起主UI線程。看看使用BackgroundWorkerDispatcher,這樣你就不必親自編寫所有的線程代碼。

+0

我嘗試過backgroundworker,但它仍然很慢。 – ibrahimkhan 2009-06-08 12:39:48

2

你只需要的ObservableCollection:如果您要添加/刪除/集合中的替代項目,並期待UI到這些變化自動更新。也就是說,ObservableCollection對Thomas或Andy的後臺線程加載建議來說是完美的。

這是另一個值得一提的可能性,但它有一定的侷限性。 ListBox僅爲當前滾動到視圖中的列表項目創建UI元素。如果一次只能在列表框中看到少量圖像,而其他圖像將全部從視圖中滾動出來,那麼您可以利用這一點,並讓ListBox只是延遲加載圖像。

對於這一點,你不會把實際的圖像對象在列表框中。相反,你會放一些可以按需加載圖像的東西。如果您要從磁盤或Web上加載圖像,該列表可能包含Uris。如果您正在從Web服務加載這樣的事情,那麼該列表可能包含具有延遲加載映像的Image屬性的類的實例。

然後將您的集合(任何列表,不一定是ObservableCollection)綁定到ListBox,並將ItemTemplate設置爲DataTemplate,該DataTemplate構造適當的UI並綁定到Uri或延遲加載的Image屬性。

上行:簡單。無需編寫線程代碼。

缺點:這將取決於數據量,但是這很可能使滾動緩慢,因爲直到你開始滾動後的圖像不會加載。另外,正如我所指出的,如果大多數圖像在第一次顯示時都適合列表框,那麼這不會讓您獲得太多收益,而線程化會是更好的答案。而Uri有一個很大的問題,一旦你向下滾動,ListBox會丟棄它爲第一項加載的圖像,所以滾動備份將像滾動一樣慢(儘管自定義類與一個懶加載屬性會解決這個問題)。

相關問題