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

时间:2016-02-09 23:55:23

标签: c# image xamarin mono xamarin-forms

在xamarin表单中,我们可以创建如下图像:

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

将此添加到布局后如果url返回图像,它将显示它。我现在想要的是有一种方法可以知道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条目。使用此方法搞乱了listview加载的时间。

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

也许会有进一步的改进。有什么想法吗?

2 个答案:

答案 0 :(得分:6)

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




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




https: //github.com/molinch/FFImageLoading




答案 1 :(得分:1)

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

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

在您的功能中,正如您所提到的,您每次都在下载图像。

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

通过在平台特定层上实现类似的功能,可以解决您每次重新下载图像的当前解决方案。

或者作为一种解决方法,如果您不想实现上述内容,则可以尝试将两个Image控件相互堆叠,可能放在Grid中,底部图像显示默认占位符图片,以及顶部另一个Image控件,如果使用UriImageSource成功下载,则会显示预期图像。

你也可以勾选PropertyChange Image的{​​{1}}通知并检测它的设置,然后显示图像。检测到后,您可以从临时占位符Source控件中释放图像吗?