Xamarin Forms无法从网络获取图片问题求助
问题描述
在页面ViewModel中,尝试通过公司WebService获取图片并绑定到ProductImage属性展示,使用ImageSource.FromUri方式加载后图片无法显示。经确认生成的URL可正常访问图片,此前使用FromStream方式加载完全正常,仅替换了加载方式,其他逻辑未改动。
当前使用FromUri的代码
string path = $@"http://www.MyCompany.be/cdn-cgi/image/width=150,quality=75/images/products/{CurrentProduct.Image}".Replace($"\\", $"/"); ProductImage = ImageSource.FromUri(new Uri(path));
属性变更通知实现
public ImageSource ProductImage { get { return _productImage; } set { if (_productImage != value) { _productImage = value; OnPropertyChanged(); } } }
之前正常工作的FromStream代码
//Get target's SmbFile. var file = new SmbFile(path, auth); try { if (file.Exists()) { // Get readable stream. var readStream = file.GetInputStream(); //Create reading buffer. MemoryStream memStream = new MemoryStream(); //Get bytes. ((Stream)readStream).CopyTo(memStream); var stream1 = new MemoryStream(memStream.ToArray()); if (stream1.Length < 30000000) { //Save image //ProductImage = ImageSource.FromStream(() => stream1); //Dispose readable stream. readStream.Dispose(); InfoColSpan = 1; } else { Common.AlertError("Image trop lourde pour l'affichage"); } } } catch (Exception ex) { Common.AlertError(ex, "Impossible de charger l'image"); }
排查与解决建议
- 编码图片名称:如果
CurrentProduct.Image包含空格、特殊字符,会导致Uri解析异常,需对这部分进行URL编码:string encodedImageName = Uri.EscapeDataString(CurrentProduct.Image); string path = $"http://www.MyCompany.be/cdn-cgi/image/width=150,quality=75/images/products/{encodedImageName}".Replace(@"\\", "/"); ProductImage = ImageSource.FromUri(new Uri(path)); - 检查平台权限配置:
- Android:确认
AndroidManifest.xml中添加了<uses-permission android:name="android.permission.INTERNET" />权限; - iOS:若使用HTTP域名,需在
Info.plist中配置ATS例外,允许非HTTPS网络请求;
- Android:确认
- 捕获加载错误信息:在XAML的Image控件中绑定错误事件,获取具体失败原因:
后台代码:<Image Source="{Binding ProductImage}" Error="Image_OnError" />private void Image_OnError(object sender, ImageErrorEventArgs e) { Common.AlertError($"图片加载失败: {e.ErrorMessage}"); } - 切换到UI线程更新属性:属性变更通知可能因线程问题未触发,强制在UI线程设置
ProductImage:Device.BeginInvokeOnMainThread(() => { ProductImage = ImageSource.FromUri(new Uri(path)); }); - 对比新旧URL差异:直接输出
path变量的完整值,和Stream方式使用的path做对比,确认是否存在斜杠、编码等细微差异。
内容的提问来源于stack exchange,提问作者Elgate
相关产品推荐
相关产品推荐

