Xamarin Forms:如果未找到 Url,则为默认图像

Xamarin Forms: Default Image if Url not found

在 xamarin 表单中,我们可以创建这样的图像:

Image i = new Image { Source = "http://www.foo.com/foo.jpg };

将此添加到布局后,如果 url returns 图像,它将显示它。我现在想要的是有没有办法知道 Url 是否是真实图像。否则我将显示默认图像。

此致。

编辑

我创建了一个函数:

public string GetImageSourceOrDefault(string orgUrl)
        {
            var req = (HttpWebRequest)WebRequest.Create(orgUrl);
            req.Method = "HEAD";
            try
            {
                using (var resp = req.GetResponse())
                {
                    bool res = resp.ContentType.ToLower(CultureInfo.InvariantCulture)
                        .StartsWith("image/");
                    if (res)
                        return orgUrl;
                    else
                        return "defualt_logo.jpg";
                }
            }
            catch
            {
                return "default_logo.jpg";
            }

        }

这个函数可以解决问题。但是,对于每个图像,它都会发出请求。我有一个显示 220 个条目的列表视图。使用此方法会扰乱列表视图的加载时间。

注意:此函数是使用依赖注入本机调用的。

也许可以进一步改进。有什么想法吗?

使用Xamarin.Forms UriImageSource可以指定不同的缓存长度,以及是否使用缓存通过属性CacheValidityCachingEnabled.

默认情况下,它会在设备的本地存储中自动缓存结果 1 天。

在你的函数中,正如你提到的,你每次都在下载图像。

您当前没有存储和缓存结果供以后重复使用的功能。

通过在平台特定层上实现类似的东西,将绕过您当前每次都重新下载图像的解决方案。

或者作为变通方法,如果您不想实施上述操作,您可以尝试将两个 Image 控件堆叠在一起,也许在 Grid 中,底部图像显示默认的占位符图像,并在顶部显示另一个 Image 控件,如果成功下载,将显示预期的图像,使用 UriImageSource.

您也可以在 Image.SourcePropertyChange 通知中挂钩并检测它是否已设置,然后显示图像。检测到后,您可以从临时占位符 Image 控件释放图像?

FFImageLoading CachedImage 支持加载和错误占位符(以及更多)。它基本上是具有附加属性的 Image 的 API 兼容替代品。你可以试试看。

    var cachedImage = new CachedImage() {
        LoadingPlaceholder = "Loading.png",
        ErrorPlaceholder = "Error.png"
    };

https://github.com/molinch/FFImageLoading