我有一个 GridView,其元素包含一个 TextBlock 和一个图像。TextBlock 总是可以很好地填充,但有时不会为一两个项目加载图像。如果我刷新数据源,图像会正确显示。我认为问题在于时间(所有数据获取都是异步完成的)。这是从磁盘获取图像的代码。所有图像均为 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(); 原始照片列表不包含所有照片。第一个代码块(上图)中发生了错误。下一步是当我在我的列表中填充图像和文本框时(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 列表完成绑定(并且相同的图块仍然缺少图片)