2012-11-27 58 views
2

我正在構建Windows應用商店應用並同時學習XAML。我有一個我想在GridView中顯示的http URI的遠程圖像。爲什麼將XAML Image Source設置爲URI比使用HttpClient獲取Image更快?

我原先的解決方案涉及使用HttpClient到XAML Image控件的源屬性下載從URI圖像字節數組,得到一個RandomAccessStreamReference,構建BitmapImage,然後設置到構造BitmapImage。但是,這個解決方案證明是相當慢的(1-2秒獲得單個圖像)。

我的下一個解決方案是將原始URI直接綁定到XAML Image控件的source屬性,XAML引擎似乎將自己解決這個問題。過去需要10秒才能突然加載約8-10張圖像,這是瞬間的。

有誰知道默認URI轉換爲XAML Image控制究竟如何解決遠程圖像數據嗎?我的第一個解決方案完全可能實施得不好,但這種差距足以激起我的好奇心。

回答

3

假設我發現的代碼從ImageSourceConverter類右邊那條,當你指定源爲一個字符串,該轉換器正試圖做到這一點:

if (((value is string) && !string.IsNullOrEmpty((string) value)) || (value is Uri)) 
    { 
     UriHolder uriFromUriContext = TypeConverterHelper.GetUriFromUriContext(context, value); 
     return BitmapFrame.CreateFromUriOrStream(uriFromUriContext.BaseUri, uriFromUriContext.OriginalUri, null, BitmapCreateOptions.None, BitmapCacheOption.Default, null); 
    } 

BitmapFrame反過來使用BitmapDecoder來加載圖像。當來源是Uri,BitmapDecoder,在一系列安全性和健全性檢查中,使用WpfWebRequestHelper(未記錄)來請求或「下載」圖像。如果生成的響應流是有效文件,則直接將該流加載到新的FileStream中。

接下來,本機Windows圖像解碼功能接管您的圖像。另外請注意,BitmapDecoder獲得緩存,所以如果您要連續加載多個圖像,則不需要重新初始化新的BitmapDecoder。無論這與你的表現問題有什麼關係,我都不能說。

總之,我猜,WPF內部使用加載圖像的方法是在這樣一個高度優化的方法。我沒有看過HttpClient的實現與可能使用簡單HttpWebRequest來下載圖像的實現,但我懷疑你的方法的開銷比內置方法的開銷多,並且是對你的較慢性能。

如果您想知道我是如何解讀這些信息的,我只需使用名爲Reflector的工具在PresentationCore程序集的System.Windows.Media名稱空間中檢查了幾個類。

相關問題