在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加载的时间。
注意:使用依赖注入本机调用此函数。
也许会有进一步的改进。有什么想法吗?
答案 0 :(得分:6)
FFImageLoading CachedImage
支持加载和错误占位符(以及更多)。它基本上是具有附加属性的 Image
的API兼容替代品。你可以试试。
var cachedImage = new CachedImage(){
 LoadingPlaceholder =“Loading.png”,
 ErrorPlaceholder =“Error.png”
 }



 

答案 1 :(得分:1)
使用Xamarin.Forms
UriImageSource
,您可以指定不同的缓存长度,以及是否使用属性CacheValidity
和CachingEnabled
来使用缓存。
默认情况下,它会自动在设备的本地存储空间中缓存1天的结果。
在您的功能中,正如您所提到的,您每次都在下载图像。
您目前没有存储和缓存结果的功能,以便以后重复使用。
通过在平台特定层上实现类似的功能,可以解决您每次重新下载图像的当前解决方案。
或者作为一种解决方法,如果您不想实现上述内容,则可以尝试将两个Image
控件相互堆叠,可能放在Grid
中,底部图像显示默认占位符图片,以及顶部另一个Image
控件,如果使用UriImageSource
成功下载,则会显示预期图像。
你也可以勾选PropertyChange
Image
的{{1}}通知并检测它的设置,然后显示图像。检测到后,您可以从临时占位符Source
控件中释放图像吗?