WinRT预加载图像
我有一个Windows 8.1 XAML应用程序,我想在页面之间导航之前预先加载图像。
我现在的天真代码是:
// Page1.xaml.cs private void Button_Click(object sender, RoutedEventArgs e) { Frame.Navigate(typeof(Page2)); }
在第二页:
// Page2.xaml.cs this.image1.Source = new BitmapImage(new Uri("ms-appx:///Assets/image1.jpg")); this.image2.Source = new BitmapImage(new Uri("ms-appx:///Assets/image2.jpg"));
现在,当我单击按钮进行导航时,我可以看到正在加载的图像并且当时显示一个图像。 我想在按钮点击上预先加载图像,只在图像加载后导航。
不幸的是,只是创建BitmapImage
对象并等待ImageOpened
事件不起作用。 如果未将图像渲染到屏幕,则看起来不会加载图像。
有没有办法强制从代码加载图像而不将它们添加到可视树?
(注意:一种解决方法是以一种看不见的方式将所有图像实际添加到Window中,但是如果可能的话我想避免这种情况)
最终解决方案
这是我使用SetSourceAsync
提出的,正如Filip Skakun所建议的那样 :
// Page1.xaml.cs private async void Button_Click(object sender, RoutedEventArgs e) { bitmapImage1 = new BitmapImage(); bitmapImage2 = new BitmapImage(); // Load both images in parallel var task1 = loadImageAsync(bitmapImage1, "image1.jpg"); var task2 = loadImageAsync(bitmapImage2, "image2.jpg"); await Task.WhenAll(task1, task2); Frame.Navigate(typeof(Page2)); } private Task loadImageAsync(BitmapImage bitmapImage, string path) { var filePath = ApplicationData.Current.LocalFolder.Path + "\\" + path; var file = await StorageFile.GetFileFromPathAsync(filePath); var stream = await file.OpenAsync(FileAccessMode.Read); await bitmapImage.SetSourceAsync(stream); }
// Page2.xaml.cs this.image1.Source = bitmapImage1; this.image2.Source = bitmapImage2;
WinRT XAML Toolkit的AlternativeFrame
控件和AlternativePage
一个具有ShouldWaitForImagesToLoad
属性,当您设置为true并导航到页面时 – 只会在加载图像时显示页面。 AlternativePage
有一个Preload()
方法,您也可以覆盖它以在显示页面之前添加更多东西等待。 它实现的方式是首先将页面添加到可视树中的不可见容器中,因此会触发这些BitmapImages
加载。
另一种选择可能是使用SetSourceAsync()
你可以等待,我认为它在你在UI中使用BitmapImage
之前开始加载,但是你需要自己下载文件。