2017-02-21 123 views
0

任何人都知道如何在WPF中異步創建BitmapFrame以異步方式異步創建BitmapFrame

我想批量打印XAML Image元素,其Source屬性被設置後面的代碼。這裏LogoImageUrl是我想異步加載的Web圖像的URL。

LogoImage.Source = BitmapFrame.Create(new Uri(LogoImageUrl)); 

我可以創造一個async方法是這樣的:

public async Task<BitmapFrame> GetBitmapFrame(Uri uri) 
{ 
    await ... // What to be awaited? 

    return BitmapFrame.Create(uri); 
} 

......這樣我就可以使用該方法在try塊,然後在finally塊打印出來?

+1

您可以使用[IsAsync](https://msdn.microsoft.com/en-us/library/system.windows.data.binding.isasync(v = vs.110).aspx)屬性綁定來實現這一點。 – Sinatr

+0

你正在加載本地或遠程(網絡)圖像文件? – Clemens

+0

@Clemens我想加載網頁圖像。 –

回答

1

你應該異步從下載緩衝下載網站形象,創造BitmapFrame:

public async Task<BitmapFrame> GetBitmapFrame(Uri uri) 
{ 
    var httpClient = new System.Net.Http.HttpClient(); 
    var buffer = await httpClient.GetByteArrayAsync(uri); 

    using (var stream = new MemoryStream(buffer)) 
    { 
     return BitmapFrame.Create(
      stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
    } 
} 

由於BitmapFrame.Create呼叫在上面的例子返回凍結BitmapFrame,您還可以異步創建BitmapFrame (儘管我懷疑這是必要的)。

public async Task<BitmapFrame> GetBitmapFrame(Uri uri) 
{ 
    var httpClient = new System.Net.Http.HttpClient(); 
    var buffer = await httpClient.GetByteArrayAsync(uri); 

    return await Task.Run(() => 
    { 
     using (var stream = new MemoryStream(buffer)) 
     { 
      return BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
     } 
    }); 
} 
+0

呃,我怎麼能想到HttpClient ...謝謝,它的工作原理! –