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 のリストを使用して行われます (同じタイルにはまだ画像がありません)。