1

我有一个 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 列表完成绑定(并且相同的图块仍然缺少图片)

4

1 回答 1

1

发布后大约 20 分钟,msdn 论坛上的某个人回答了我的问题。从大约一周前开始,这个问题就一直困扰着我的程序,但在过去的 3 天里,我才真正开始研究这个令人愤怒的问题。

如何修复:从本地磁盘填充 ListView 或 GridView 数据绑定图像时,不要使用 Stream 作为 BitmapImage 源 - 使用带有指向目标图像的 Uri 对象的 BitmapImage 构造函数。

就是这样:

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

照片.添加(tempBitmap);`

于 2012-06-27T07:32:08.933 回答