我有一个连续图像列表,需要在用户点击“下一步”时按顺序加载。下一页的确定方法是在网址末尾添加一个数字,如下所示:http://twoimages.com/image_1
到http://twoimages.com/image_2
。我希望能够检测到何时无法加载图像。我可以使用一个事件,但只有在它失败并完成运行其余代码后才会触发。
public void LoadImage(string ImageUrl)
{
BitmapImage bmpImage;
if (this.SilverlightImage.Source is BitmapImage)
{
bmpImage = this.SilverlightImage.Source as BitmapImage;
}
else
{
bmpImage = new BitmapImage();
bmpImage.DownloadProgress += new EventHandler<DownloadProgressEventArgs>(bitmapImage_DownloadProgress);
}
bmpImage.UriSource = new Uri(ImageUrl, UriKind.RelativeOrAbsolute);
if (this.SilverlightImage.Source == null)
{
this.SilverlightImage.Source = bmpImage;
}
}
我希望能够检测到何时无法加载图像,甚至不会尝试加载不存在的图像。
谢谢,
亚伦
答案 0 :(得分:0)
你可以在开始时请求完整的图像列表或它们的计数,而不是开始加载......我认为你不能用BitmapSource发送关于下一个图像的信息,可能是图像保留字节可以帮助,但那只是哈克
答案 1 :(得分:0)
假设您在运行时没有已知数量的图像或程序已知的某些其他数据来查看图像URI是否有效,处理此问题的方法是调用文件系统服务器在尝试加载它之前查看图像是否存在(可能通过创建返回给定文件是否存在的服务),这似乎远比仅仅尝试加载图像效率低得多。因为该服务调用需要是异步的(因为所有服务调用都在Silverlight中),所以无论如何都要考虑重构代码来监听事件,尽管你可以把它变成一个非常封闭的循环。
我认为更大的问题是:如果你试图减少运行其余代码的开销,这只会适得其反,因为多个网络调用几乎肯定比任何代码需要更多的开销/时间我正在跑步。
唯一想到的另一种方法是编写一个服务,返回包含图像和标志的某种复杂对象,以告诉您下一个图像是否可用。这似乎有点矫枉过正,但是如果您真的需要知道下一张图像是否存在,那么在尝试加载它之前可能值得考虑一下。同样,我要指出这个服务需要异步调用,所以你在任何情况下都在监听事件,你要创建的服务并不是很简单(你需要一些WCF孩子)将返回复杂对象的服务)。我也认为这个解决方案不值得这么麻烦。
答案 2 :(得分:0)
解决此问题最明智的方法是先下载“图像清单”。这可以是一个简单的XML文件或生成xml的简单ashx。没有必要做更重的事情,比如构建服务或使用WCF。
然后使用此XML中的URL列表传递给LoadImage方法,并且当到达最后一个按钮时可以禁用“下一步”按钮(并在第一个按钮时禁用“上一个”按钮)。
这不仅重量轻,而且允许使用有意义的文件名,并且可能会添加您可能希望将来包含在图像中的其他元数据。
如果你真的必须
但是,如果您确实需要快速检查文件的存在性,可以使用ClientHTTP
实例HttpWebRequest
对该文件发出“HEAD”请求。但是,如果您使用基于cookie的安全性,这可能会更加困难。