1

TextBlock と Image を含む要素を持つ GridView があります。TextBlock は常に正常に読み込まれますが、Image は 1 つまたは 2 つの項目に対して読み込まれないことがあります。データ ソースを更新すると、画像が正しく表示されます。問題はタイミングにあると思います(すべてのデータフェッチは非同期で行われます)。ディスクから画像を取得するコードは次のとおりです。すべての画像は 140x140 ピクセルで、PNG ファイルです。

public async Task<List<BitmapImage>> getPhotos()
        {
            photos.Clear(); //clears list of photos

            IReadOnlyList<IStorageFile> files = (IReadOnlyList<IStorageFile>)await folderHierarchy.Last().GetFilesAsync(); //reads in all files from current working directory

            foreach (StorageFile currentFile in files) //for each file in that directory
            {
                if (currentFile.Name.EndsWith(".png")) //only handle png files
                {
                    photos.Add(await getBitmapImageAsync(currentFile)); //actually read in image from separate async method (bellow)
                }
            }

            return photos;
        }

        public async Task<BitmapImage> getBitmapImageAsync(StorageFile storageFile)
        {
            BitmapImage image = new BitmapImage();
            FileRandomAccessStream stream = (FileRandomAccessStream) await storageFile.OpenAsync(FileAccessMode.Read);
            image.SetSource(stream);

            return image;
        }

このメソッドを次のように実行します。 List tilePicturesArray = await dataFetcherClass.getPhotos(); 元の写真リストには、すべての写真が含まれているわけではありません。コードの最初のブロック (上記) で何か問題が発生しています。次のステップは、List で Image と TextBox を設定するときです (GridViewCell は、GridView でデータをバインドするために作成したクラスです) GridViewCell オブジェクトのリストは、GridView にバインドされているものです。これが問題だとは思いません。

for (int x = 0; x < tileTitlesArray.Count; x++) //this IS running inside of an async method
            {
                GridViewCell singleCell = new GridViewCell();

                singleCell.tileName = tileTitlesArray.ElementAt(x);
                singleCell.tileImage = tilePicturesArray.ElementAt(x);

                tileCells.Add(singleCell); //tileCells is the datasource for gridview
            }

問題の原因は何だと思いますか? 上記のループを基本的に再実行する (gridview データソースとタイルを再設定する) が、tilePicturesArray を再フェッチしない小さな更新ボタンを追加したので、バインディングは同じ元の BitmapImages のリストを使用して行われます (同じタイルにはまだ画像がありません)。

4

1 に答える 1

1

これを投稿してから約20分後、msdnフォーラムの誰かが私の質問に答えました。この問題は約1週間前から私のプログラムを悩ませてきましたが、私はこの3日間でこの腹立たしい問題を実際に調べ始めました。

修正方法:ローカルディスクからListViewまたはGridViewデータバインディングイメージを設定する場合、BitmapImageソースとしてストリームを使用しないでください。ターゲットイメージを指すUriオブジェクトでBitmapImageコンストラクターを使用してください。

方法は次のとおりです。

`BitmapImage tempBitmap = new BitmapImage(new Uri(currentFile.Path));

photos.Add(tempBitmap); `

于 2012-06-27T07:32:08.933 に答える