2012-03-03 50 views
2

我在运行时从xml文件读取器获取图像URL。这个图片的URL传递给下面的方法来动态下载它。如何在Windows8 metro应用程序中动态下载和显示图像

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

但这不起作用。我没有得到任何图像源。上面的代码可以在编译时提供的静态URL上正常工作。我需要做更多的事情?

+0

WinRT的文档是很不够的现在。但请记住,任何可能需要超过50毫秒的*任何*都需要异步完成。看看你从ImageOpened事件中得到了什么。不要忘记ImageFailed。 – 2012-03-03 13:10:11

+0

Casn您详细阐述了如何在运行时获取文件。这是通过FilePicker吗?当你的意思是静态内容时,这个内容是你应用程序的一部分吗? – 2012-03-03 17:55:09

回答

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的助手返回

2

我以前的工作位图代码在Windows RT上工作时遇到类似的问题,早期的尝试说服我拒绝下载任何东西,除非它将显示在UI上(这里,我需要在分配前插入1ms延迟小号只是OURCES得到它的触发图像下载):

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; 
+0

一个非常简短的&甜蜜的解决方案_(#2)_。我需要一个从基本认证安全的网站下载图像。使用您的_HttpClient_方法,我可以使用标题解锁网站,并且** VOILA!**。谢谢安东尼。 – iSofia 2015-08-15 13:31:28

相关问题