WinRT 预加载图像
本文关键字:图像 加载 WinRT | 更新日期: 2023-09-27 17:56:01
我有一个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
事件不起作用。如果图像未呈现到屏幕上,则似乎不会加载图像。
有没有办法强制从代码加载图像而不将它们添加到可视化树中?
(注意:解决方法是以某种不可见的方式实际将所有图像添加到窗口中,但如果可能的话,我想避免这种情况)
最终解决方案:
这是我使用 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 工具包的AlternativeFrame
控件和AlternativePage
具有ShouldWaitForImagesToLoad
属性,当您设置为 true 并导航到页面时,该属性将仅在加载图像时显示页面。 AlternativePage
有一个Preload()
方法,您还可以覆盖以在显示页面之前添加更多要等待的内容。它的实现方式是页面首先添加到可视化树中的不可见容器中,因此触发这些BitmapImages
的加载。
另一种选择可能是使用您可以等待的SetSourceAsync()
,我认为它会在您使用 UI 中的BitmapImage
之前开始加载,但随后您需要自己下载文件。