2017-04-01 96 views
2

UWP应用程序,一组视图模型被实例化并填充到页面的构造函数中。每个物品都有一个名为ImageSource的属性,类型为BitmapImage,初始化为新的BitmapImage()。该视图具有绑定到集合的网格视图。在该视图中,为集合的项目定义DataTemplate。特别是,DataTemplate显示了一个图像,其源代码绑定到该项目的属性ImageSourceDataTemplate也处理Image的事件,因此它在图像仍在加载时显示一个占位符。 页面的Loaded事件触发所有图像源的下载:uwp延迟加载图像源

 private async void Page_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) 
     { 
      foreach (ImageViewModel imageViewModel in this.imageViewModels) 
      { 
       IRandomAccessStream randomAccessStream = await SlowImageSourceProvider.GetRandomAccessStream(imageViewModel.Id); 
       await imageViewModel.ImageSource.SetSourceAsync(randomAccessStream); 
      } 
     } 

在这段代码中,IRandomAccessStream一个实例从一个缓慢的提供商获取的,像HttpClient听慢速网络上。

视图上的Image.Source绑定到上面代码的imageViewModel.ImageSource。以这种方式,在开始下载其自己的源代码之前,每个图像需要等待前一个图像结束其下载。

如何让所有图像立即开始下载,而不用等待其他图像呢?

我唯一的想法是创建一个IRandomAccessStream的懒惰实现,但我徘徊,如果有更好的方式做到这一点。

谢谢!

+1

在'从[UWP社区工具包(http://www.uwpcommunitytoolkit.com/en/ ImageEx'控制看一看主/控制/ ImageEx /)。也许这会有所帮助。 – AVK

+0

谢谢。 ImageEx具有在加载图像时显示占位符的功能,但似乎没有解决以异步且高效的方式加载图像集的问题。 –

+0

那么,我的应用程序下载50个大小为〜300 KB的图像,每个都作为集合而不挂起屏幕,并使用惰性实现将它们加载到我的'GridView'中。尝试示例应用程序,看看它是否适合您的要求。 – AVK

回答

1

图像一次只能下载一个图像,因为foreach在两个await陈述完成之前不会开始另一个迭代。要请求所有拍摄图像的同时下载并等待他们完成异步尝试以下操作:

private async void Page_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) { 
    var setImageTasks = this.imageViewModels.Select(async imageViewModel => { 
     var randomAccessStream = await SlowImageSourceProvider.GetRandomAccessStream(imageViewModel.Id); 
     await imageViewModel.ImageSource.SetSourceAsync(randomAccessStream); 
    }).ToArray(); 
    await Task.WhenAll(setImageTasks); 
}