C# WinRT预加载图像

C# WinRT预加载图像,c#,xaml,windows-runtime,windows-8.1,C#,Xaml,Windows Runtime,Windows 8.1,我有一个Windows 8.1 XAML应用程序,我想在页面之间导航之前预加载图像 我现在的天真代码是: //Page1.xaml.cs 私有无效按钮\u单击(对象发送者,路由目标e) { 框架.导航(类型(第2页)); } 在第二页: //Page2.xaml.cs this.image1.Source=新位图图像(新Uri(“ms”)-appx:///Assets/image1.jpg")); this.image2.Source=新位图图像(新Uri(“ms”)-appx:///Asse

我有一个Windows 8.1 XAML应用程序,我想在页面之间导航之前预加载图像

我现在的天真代码是:

//Page1.xaml.cs
私有无效按钮\u单击(对象发送者,路由目标e)
{
框架.导航(类型(第2页));
}
在第二页:

//Page2.xaml.cs
this.image1.Source=新位图图像(新Uri(“ms”)-appx:///Assets/image1.jpg"));
this.image2.Source=新位图图像(新Uri(“ms”)-appx:///Assets/image2.jpg"));
现在,当我单击按钮导航时,我可以看到正在加载的图像,并且一次显示一个。我想在按钮上预加载图像,并仅在图像加载后导航

不幸的是,仅仅创建
BitmapImage
对象并等待
ImageOpen
事件无法工作。如果图像未渲染到屏幕上,则似乎不会加载这些图像

有没有一种方法可以在不将图像添加到可视化树的情况下强制从代码加载图像

(注意:一种解决方法是以某种不可见的方式将所有图像添加到窗口中,但我希望尽可能避免这种情况)


最终解决方案:

这就是我用Filip Skakun建议的
SetSourceAsync
得出的结论:

//Page1.xaml.cs
专用异步无效按钮\u单击(对象发送方,路由目标)
{
BitmapImage 1=新的BitmapImage();
BitmapImage 2=新的BitmapImage();
//并行加载两个图像
var task1=loadImageAsync(bitmapImage1,“image1.jpg”);
var task2=loadImageAsync(bitmapImage2,“image2.jpg”);
等待任务。WhenAll(任务1,任务2);
框架.导航(类型(第2页));
}
专用任务loadImageAsync(BitmapImage BitmapImage,字符串路径)
{
var filePath=ApplicationData.Current.LocalFolder.Path+“\\”+Path;
var file=await-StorageFile.GetFileFromPathAsync(filePath);
var stream=await file.OpenAsync(FileAccessMode.Read);
等待bitmapImage.SetSourceAsync(流);
}
//Page2.xaml.cs
this.image1.Source=bitmapImage1;
this.image2.Source=bitmapImage2;
WinRT XAML Toolkit的控件,其中一个控件有一个
ShouldWaitForImagesToLoad
属性,当您设置为true并导航到页面时,该属性将仅在加载图像时显示页面
AlternativePage
有一个
Preload()
方法,在显示页面之前,您还可以覆盖该方法以添加更多等待的内容。不过,它的实现方式是首先将页面添加到可视化树中的一个不可见容器中,从而触发加载那些
位图图像

另一个选项可能是使用它,您可以等待,我认为它会在您使用UI中的
BitmapImage
之前开始加载,但是您需要自己下载该文件。

WinRT XAML Toolkit的控件,其中一个控件具有
ShouldWaitForImagesToLoad
属性,当您设置为true并导航到页面时,该属性将仅在图像加载后显示页面
AlternativePage
有一个
Preload()
方法,在显示页面之前,您还可以覆盖该方法以添加更多等待的内容。不过,它的实现方式是首先将页面添加到可视化树中的一个不可见容器中,从而触发加载那些
位图图像


另一个选项可能是使用您可以等待的文件,我认为它在您在UI中使用
BitmapImage
之前开始加载,但之后您需要自己下载该文件。

我不仅需要在页面转换时使用它,在其他地方也需要它。所以替代页面不是我需要的。但我确实使用了
SetSourceAsync
解决了这个问题。谢谢我经常做的一件事就是使用这种方法——等待所有
图像
源加载到任何可视化树中。我不仅需要在页面转换时使用这种方法,在其他地方也需要。所以替代页面不是我需要的。但我确实使用了
SetSourceAsync
解决了这个问题。谢谢我经常做的一件事就是使用这种方法——等待所有
图像
源加载到任何可视化树中。