可以';在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()还是其他我可能缺少的东西。

提前感谢:)

可以';在Windows 8 metro应用程序中,无法正确读取StorageFile中的所有文件

我想这只是一个时间问题,但在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);
            }
        }

再次感谢各位!