如何在Windows8 metro应用程序中动态下载和显示图像

时间:2012-03-03 08:19:33

标签: c# windows-8 microsoft-metro

我在运行时从xml文件阅读器获取图像URL。此图像URL将传递给以下方法以动态下载。

 public void Display_Image(string MyURL)
  {
           BitmapImage bi = new BitmapImage();
           bi.UriSource = new Uri(this.BaseUri, MyURL);
           Img_Poster.Source = bi;
  }

但这不起作用。我没有得到任何图像源。上面的代码适用于编译时提供的静态URL。我还需要做些什么?

2 个答案:

答案 0 :(得分:4)

我在下面建议的方法已经过时了。但是,创建一个在运行时确定的Uri动态创建的新Bitmap映像,并支持Windows 8的RTM版本.Display_Image(url)应该按预期工作。


您可以使用CreateFromUri帮助程序获取图像流:http://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.streams.streamreference.createfromuri.aspx#Y0

var stream = RandomAccessStreamReference.CreateFromUri(new Uri(imageUrl))

然后,您应该能够将位图的源设置为助手返回的RandomAccessStream

答案 1 :(得分:2)

我曾经遇到类似的问题,以前工作的Bitmap代码无法在Windows RT上工作,早期的尝试让我相信它拒绝下载任何东西,除非它将在UI上显示(这里,我需要插入一个在分配源之前1ms延迟只是为了让它触发图像下载):

var image = .... // reference to animage on the UI
var placeholder = ... // a placeholder BitmapImage
var source = ... // uri to download

image.Source = placeholder;
var src = new BitmapImage(new Uri(source));
src.ImageOpened += (s, e) =>
{
    var bi = s as BitmapImage;
    image.Source = bi;
};

image.Source = src;
// Delay required to trigger download
await Task.Delay(1);
image.Source = placeholder;

这是我尝试成功的另一种解决方案:

var image = .... // reference to animage on the UI
var source = ... // uri to download
var placeholder = ... // a placeholder BitmapImage

image.Source = placeholder;

var bytes = await new HttpClient().GetByteArrayAsync(source);
var img = new BitmapImage();
await img.SetSourceAsync(bytes.AsBuffer().AsStream().AsRandomAccessStream());
image.Source = img;