我有一个应用程序加载一些对象并在网格中显示它们。其中一个对象是预览图像,它可以是本地图像文件或Web位置上的图像文件。现在它正在工作,但滚动时性能不是很好,因为每当新项目滚动到视图时,它必须加载预览,这需要一两秒钟。
我想要完成的是,当滚动到视图中时,预览框会显示并开始在后台线程上加载预览。当图像被加载时,它将通知(通过视图模型中的属性更改事件)并且图像将到位。这样,UI保持响应,预览只是空白,直到加载然后显示。如果图像尚未缓存,我有启动backgroundWorker的绑定属性的getter,并且worker例程如下(_previewCache是绑定预览的支持属性):
void bw_LoadPreview_DoWork(object sender, DoWorkEventArgs e)
{
BitmapImage _tempCache = new BitmapImage(new Uri(PreviewImagePath, UriKind.RelativeOrAbsolute));
if (_tempCache.CanFreeze)
{
_tempCache.Freeze();
Dispatcher.CurrentDispatcher.Invoke((Action)(delegate { _previewCache = _tempCache; }));
}
}
这似乎在本地文件上工作得很好,虽然它需要的时间比我预期的图像要长一些,但UI仍然保持响应。但是,当图像是Web路径时,它总是以_tempCache.CanFreeze = false结束,因此它会跳过它而不会加载。如果我试图在没有冻结的情况下进行调用,它会说它不能使用该对象,因为它由不同的线程拥有。
我错过了什么?如何以这种方式加载基于Web的图像?或者有没有更好的方法来解决这个我没有看到的问题?非常感谢任何帮助。