2017-02-21 120 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 ...谢谢,它的工作原理! –