可以';在Windows 8 metro应用程序中,无法正确读取StorageFile中的所有文件
本文关键字:读取 StorageFile 文件 Windows 应用程序 metro 可以 | 更新日期: 2023-09-27 18:26:40
我正在Windows 8 metro应用程序中开发一个简单的应用程序,并试图从PicturesLibrary中检索文件,我输入的代码如下:
public async void Initialize()
{
IReadOnlyList<StorageFile> storageFiles = await KnownFolders.PicturesLibrary.GetFilesAsync();
foreach (var storageFile in storageFiles)
{
BitmapImage bitmapImage = new BitmapImage();
FileRandomAccessStream stream = (FileRandomAccessStream)await storageFile.OpenAsync(FileAccessMode.Read);
bitmapImage.SetSource(stream);
Image image = new Image();
image.Source = bitmapImage;
Images.Add(image);
}
}
然后我使用它们的ImageSource显示这些图像。我遇到的问题是,有时它会显示所有人,有时是一个人一两个,有时它不会显示任何图像,我不明白这是因为不可用的方法GetFileAsync()还是其他我可能缺少的东西。
提前感谢:)
我想这只是一个时间问题,但在foreach中执行断点或跟踪点肯定会有所帮助。
尝试将其更改为返回Task,然后在您可以的调用者中等待它
我认为您的问题将是这一行。
FileRandomAccessStream stream = (FileRandomAccessStream)await storageFile.OpenAsync(FileAccessMode.Read);
在循环中等待可能会给您带来一些奇怪的范围问题
我会尝试的第一件事是切换这个循环的前两行。
FileRandomAccessStream stream = (FileRandomAccessStream)await storageFile.OpenAsync(FileAccessMode.Read);
BitmapImage bitmapImage = new BitmapImage();
可能是bitmapImage
参考正在重新打印到您身上。如果这没有帮助,您可能需要查看.ContinueWith
方法。
storageFile.OpenAsync(FileAccessMode.Read).ContinueWith(task => {
FileRandomAccessStream stream = (FileRandomAccessStream)task.Result;
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(stream);
Image image = new Image();
image.Source = bitmapImage;
Images.Add(image);
});
好吧,多亏了你们,我找到了解决方案,我不得不稍微重新排列代码,
public async Task Initialize()
{
IReadOnlyList<StorageFile> storageFiles = await KnownFolders.PicturesLibrary.GetFilesAsync();
foreach (var storageFile in storageFiles)
{
var image = new Image();
image.Source = await GetBitmapImageAsync(storageFile);
Images.Add(image);
}
}
public async Task<BitmapImage> GetBitmapImageAsync(StorageFile storageFile)
{
BitmapImage bitmapImage = new BitmapImage();
IAsyncOperation<IRandomAccessStream> operation = storageFile.OpenAsync(FileAccessMode.Read);
IRandomAccessStream stream = await operation;
bitmapImage.SetSource(stream);
return bitmapImage;
}
然后在OnNavigateTo事件中调用所有这些,因为构造函数不能是异步
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
_imageList = new ImagesList();
await _imageList.Initialize();
foreach (var image in _imageList.Images)
{
Image img = new Image() { Source = image.Source };
img.Width = img.Height = 200;
img.Margin = new Thickness(20, 0, 20, 0);
img.ImageFailed += image_ImageFailed;
img.PointerEntered += img_PointerEntered;
img.PointerExited += img_PointerExited;
sp_MainStackPanel.Children.Add(img);
}
}
再次感谢各位!