为什么位图图像无法在我的GridView中正确加载和显示?

时间:2012-06-27 07:07:34

标签: c# gridview windows-8 windows-runtime microsoft-metro

我有一个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完成的(并且相同的磁贴仍然缺少图片)

1 个答案:

答案 0 :(得分:1)

发布此消息后约20分钟,msdn论坛上有人回答了我的问题。大约一个星期前,这个问题一直困扰着我的计划,但过去3天我才真正开始研究这个令人愤怒的问题。

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

以下是:

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

photos.Add(tempBitmap);`