0

私はWindows8メトロアプリケーションで簡単なアプリケーションを開発していて、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を使用してこれらの画像を表示します。私が会っている問題は、それらすべてが表示されることもあれば、1つか2つ表示されることもあり、画像が表示されないこともあります。これが、待望のメソッドGetFileAsync()か、その他の理由によるものかどうかはわかりません。ない。

前もって感謝します :)

4

3 に答える 3

1

これは単なるタイミングの問題だと思いますが、foreachでブレークポイントまたはトレースポイントを実行することで確実にわかります。

これを変更してタスクを返し、発信者で待つことができます

于 2012-03-05T18:32:48.407 に答える
0

あなたの問題はこの行になると思います。

FileRandomAccessStream stream = (FileRandomAccessStream)await storageFile.OpenAsync(FileAccessMode.Read);

ループ内で待機すると、スコープの奇妙な問題が発生する可能性があります。
私が最初に試みることは、このループの最初の2行を切り替えることです。

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);
});
于 2012-03-06T10:55:03.370 に答える
0

さて、皆さんのおかげでこれに対する解決策を見つけました。コードを少し再配置する必要がありました。

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);
            }
        }

みんなありがとう!

于 2012-03-06T14:14:28.413 に答える