我有一个GridView,其元素包含TextBlock和Image。 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(); 原始照片列表不包含所有照片。在第一个代码块中发生了错误(上图)。 下一步是我在我的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,因此绑定是使用相同的原始List of BitmapImages完成的(并且相同的磁贴仍然缺少图片)
答案 0 :(得分:1)
发布此消息后约20分钟,msdn论坛上有人回答了我的问题。大约一个星期前,这个问题一直困扰着我的计划,但过去3天我才真正开始研究这个令人愤怒的问题。
如何修复:从本地磁盘填充ListView或GridView数据绑定图像时,不要使用Stream作为BitmapImage源 - 使用BitmapImage构造函数和指向目标图像的Uri对象。
以下是:
`BitmapImage tempBitmap = new BitmapImage(new Uri(currentFile.Path));
photos.Add(tempBitmap);`