最簡單的辦法是剛剛剛剛設置的Binding.IsAsync
屬性是這樣的:
<Image ImageSource="{Binding propertyThatComputesImageSource, IsAsync=true}" />
到propertyThatComputesImageSource
每個訪問將從一個線程池的線程來完成。如果線程使用ImageCacheOptions.OnLoad創建圖像,它將阻塞直到圖像加載。因此UI將立即啓動,圖像將在後臺加載並在可用時顯示。
Binding.IsAsync
對於十個或二十個圖像來說是一個很好的解決方案,但如果您有數百個圖像並且加載延遲很長,可能不是一個好的解決方案,因爲最終可能會有數百個線程。在這種情況下,完全通過直接使用線程池加載數據綁定的外側的圖像:
ThreadPool.QueueUserWorkItem((state) =>
{
foreach(var model in _models.ToArray())
model.ImageSource = LoadOneImage(model.ImageUrl);
});
這可能需要用一個Dispatcher.Invoke或兩個延長如果模型的屬性是的DependencyProperty,因爲它們不能被訪問從一個單獨的線程。
這種技術可以擴展到產生固定數量的工作人員來加載圖像和打破他們之間的工作,因此多個圖像下載正在發生,但同時下載的數量是有限的,所以你不會結束數百線程。
只要確保SynchronizationContext.Current是有意義的在BackgroundWorker啓動時。 (應該是WPF的上下文,但只是要記住)。 – 2009-11-16 02:38:34