如何使用InMemoryRandomAccessStream

时间:2013-11-06 23:51:13

标签: c# silverlight windows-phone-7 windows-phone-8 windows-phone

我正在尝试使用下面的代码在窗口电话中异步加载来自服务器的图像,但是InMemoryRandomAccessStream会带来错误

“找不到类型或命名空间名称'InMemoryRandomAccessStream'(您是否缺少using指令或程序集引用?)”

private async Task GetImageTaskAsync()
    {
        HttpClient client = new HttpClient();

        HttpResponseMessage response = await client.GetAsync("http://ts1.mm.bing.net/images/thumbnail.aspx?q=1080606601222&id=e7d54ea3862e939e6fd414b8750d86bdimage/jpeg1601204364");

        byte[] img = await response.Content.ReadAsByteArrayAsync();

        InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream();

        DataWriter writer = new DataWriter(randomAccessStream.GetOutputStreamAt(0));

        writer.WriteBytes(img);

        await writer.StoreAsync();

        BitmapImage b = new BitmapImage();

        b.SetSource(randomAccessStream);
    }

我的使用陈述如下

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using RaveCompass.Resources;
using System.Net;
using System.Windows;
using Windows.Storage.Streams;
using System.Xml.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;

请帮助,如果还有其他方法我可以异步加载网站上的图片,请提出建议

2 个答案:

答案 0 :(得分:1)

InMemoryRandomAccessStream不适用于Windows Phone,仅适用于Windows 8。查看MSDN

您无需InMemoryRandomAccessStream通过网址BitmapImage设置图片。您可以将URL本身设置为源。

private void GetImageTaskAsync()
{
    BitmapImage b = new BitmapImage(new Uri("http://ts1.mm.bing.net/images/thumbnail.aspx?q=1080606601222&id=e7d54ea3862e939e6fd414b8750d86bdimage/jpeg1601204364"));
}

答案 1 :(得分:0)

请注意,Windows Phone 7使用Silverlight的“WP版”,因此:

  1. BitmapImage的下载是一个异步操作

  2. 默认情况下,Silverlight会尝试延迟下载或呈现内容,直到必要

  3. 在将图像添加到可视树中之前,即在将要显示图像时,Silverlight不会呈现图像。

  4. 请按照Loading an http-image into WriteableImage提供的信息进行操作。我知道不如使用await那么优雅,但我没有找到任何其他方法来做到这一点。

    如果有人知道更好的方法,可能使用异步等待模式,请告诉我们。