You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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网络请求;
  • 捕获加载错误信息:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:55:23