我有一個ListView
綁定到ObservableCollection
。此ListView使用ItemTemplate,其中只包含一個Image
控件,該Source屬性綁定到URL字符串。WPF圖像 - 服務器返回禁止(403)
對於一些網址圖像加載失敗,因爲遠程服務器將返回「禁止(403)」 - 這可以加入一定頭到獲取圖像的HTTP請求來解決,但問題是我不我不知道如何去修改這個請求。
我嘗試了兩種不同的方法:
- 創建
IValueConverter
對象。我會自己取URL並獲取圖像數據 - 將其放入MemoryStream
,並使用該流初始化一個BitmapImage
對象並將其返回給Image控件。這種方法被證明非常慢,並且阻塞了UI線程。 - 創建一個綁定到該屬性的新屬性將返回一個包含圖像數據的字節數組。這些數據在第一次使用Task調用時會被懶惰地初始化。當數據完成下載時,將觸發
PropertyChanged
事件,以便可視化地更新Image。這種方法並沒有阻止UI線程,但由於某種原因速度非常慢。
我想知道兩件事情:
爲什麼是我的方法顯著慢?
如何如何直接修改圖像控件從遠程服務器獲取圖像的方式,而不會影響性能/速度?
請看下面的例子:
public byte[] ImageThumbnail
{
get
{
if (img == null) img = GetImage(ImageUrls.Thumbnail);
return img;
}
}
public byte[] GetImage(string url) {
HttpClient client = new HttpClient();
// add some headers
return client.GetByteArrayAsync(url).Result;
}
圖像將被綁定到 「ImageThumbnail」 與IsAsync設置爲True。與僅將URL直接綁定到Image源相比,在這種情況下圖像下載速度明顯較慢。
「爲什麼我的方法明顯變慢?」除非您向我們展示您的代碼,否則沒有人會說出來。作爲提示,您應該使用異步綁定(通過設置其IsAsync屬性)。當綁定調用屬性getter時,直接綁定到創建的(異步)ImageSource屬性。不要使用綁定轉換器,因爲它不會被異步調用。 – Clemens
是的,我想過爲什麼綁定轉換器不起作用,只是認爲可能存在異步實現方式。我已經嘗試過使用異步綁定 - 我已經爲該問題添加了一個示例。 – CryShana