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

本文关键字:下载和 动态 显示 显示图 图像 应用程序 Windows8 metro | 更新日期: 2023-09-27 18:26:36

我在运行时从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。我还需要做些什么?

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

我下面建议的方法已经过时了。然而,使用运行时确定的Uri创建动态创建的新位图图像是支持的,并在Windows8的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

我以前也遇到过类似的问题,以前使用的位图代码不能在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;