0

任何人都知道如何BitmapFrame在 WPF 中异步创建?

我想批量打印其属性设置在代码后面的 XAMLImage元素。SourceLogoImageUrl是我要异步加载的 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块中打印它?

4

1 回答 1

1

您应该异步下载 Web 图像并从下载的缓冲区创建 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);
        }
    });
}
于 2017-02-21T08:26:10.040 回答