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
可以指定不同的缓存长度,以及是否使用缓存通过属性CacheValidity
和CachingEnabled
.
默认情况下,它会在设备的本地存储中自动缓存结果 1 天。
在你的函数中,正如你提到的,你每次都在下载图像。
您当前没有存储和缓存结果供以后重复使用的功能。
通过在平台特定层上实现类似的东西,将绕过您当前每次都重新下载图像的解决方案。
或者作为变通方法,如果您不想实施上述操作,您可以尝试将两个 Image
控件堆叠在一起,也许在 Grid
中,底部图像显示默认的占位符图像,并在顶部显示另一个 Image
控件,如果成功下载,将显示预期的图像,使用 UriImageSource
.
您也可以在 Image
.Source
的 PropertyChange
通知中挂钩并检测它是否已设置,然后显示图像。检测到后,您可以从临时占位符 Image
控件释放图像?
FFImageLoading CachedImage
支持加载和错误占位符(以及更多)。它基本上是具有附加属性的 Image
的 API 兼容替代品。你可以试试看。
var cachedImage = new CachedImage() {
LoadingPlaceholder = "Loading.png",
ErrorPlaceholder = "Error.png"
};
在 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
可以指定不同的缓存长度,以及是否使用缓存通过属性CacheValidity
和CachingEnabled
.
默认情况下,它会在设备的本地存储中自动缓存结果 1 天。
在你的函数中,正如你提到的,你每次都在下载图像。
您当前没有存储和缓存结果供以后重复使用的功能。
通过在平台特定层上实现类似的东西,将绕过您当前每次都重新下载图像的解决方案。
或者作为变通方法,如果您不想实施上述操作,您可以尝试将两个 Image
控件堆叠在一起,也许在 Grid
中,底部图像显示默认的占位符图像,并在顶部显示另一个 Image
控件,如果成功下载,将显示预期的图像,使用 UriImageSource
.
您也可以在 Image
.Source
的 PropertyChange
通知中挂钩并检测它是否已设置,然后显示图像。检测到后,您可以从临时占位符 Image
控件释放图像?
FFImageLoading CachedImage
支持加载和错误占位符(以及更多)。它基本上是具有附加属性的 Image
的 API 兼容替代品。你可以试试看。
var cachedImage = new CachedImage() {
LoadingPlaceholder = "Loading.png",
ErrorPlaceholder = "Error.png"
};