我想加載Gravatar-Images並將它們從後面的代碼設置爲WPF圖像控件。 因此,代碼看起來像使WPF圖像加載異步
imgGravatar.Source = GetGravatarImage(email);
凡GetGravatarImage樣子:
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri(GravatarImage.GetURL("http://www.gravatar.com/avatar.php?gravatar_id=" + email) , UriKind.Absolute);
bi.EndInit();
return bi;
不幸的是,當網絡連接速度較慢該鎖定GUI。有沒有一種方法來分配圖像源,並讓它在後臺加載圖像而不會阻塞UI?
謝謝!
的BitmapImage也有[與URI參數的構造函數(http://msdn.microsoft.com/en-us/library/ms602473.aspx),這將節省您的BeginInit在/ EndInit調用。 – Clemens
+1不知道,很好的提示。我只是複製了作者的代碼,並沒有考慮如何優化實際下載,而是專注於以優雅的方式解決UI塊問題(當然,如果代碼不是異步的,它會阻止)。我認爲對於重複使用,轉換器也可以從綁定中獲得完整的url,使其更具可重用性,而不是電子郵件。我不喜歡使用'ThreadPool',因爲你必須隨時管理調度。這使得它對我來說不夠純粹的MVVM應用程序。 – JanW
你能否給出一個解釋,爲什麼創建一個BitmapImage會在不被異步調用時阻塞。爲什麼然後它有'IsDownloading'屬性和'DownloadCompleted'事件。如果您只是將XAML中的Image控件的「Source」屬性設置爲引用Web上大圖像的URL,則UI將不會被阻止。相反,WPF會在後臺下載圖像,並在下載完成後立即顯示。 – Clemens