1

我有一个使用 MVVM、XAML 和 C# 的 Windows 8 项目。

我的一种方法目前是更新ObservableCollectionPictures 文件夹中的所有图像,转换为BitmapImage格式,这与我的 xaml 绑定以在ListGrid. 我遇到的问题是我希望使用 in 的SelectedItem属性ListGrid来允许用户打开 DoubleTapped 的图片 - 为此,我需要BitmapImages在我的ObservableCollection. 目前,当我尝试执行此操作时,该UriSource属性设置为 null。我做错了什么?

这是填充我的 ObservableCollection, "Images" 的方法:

  private async void FindRelatedImages()
        {
            FileOpenPicker picPicker = new Windows.Storage.Pickers.FileOpenPicker();
            List<string> fileTypeFilter = new List<string>();
            fileTypeFilter.Add(".png");
            fileTypeFilter.Add(".jpg");
            fileTypeFilter.Add(".jpeg");
            fileTypeFilter.Add(".gif");
            fileTypeFilter.Add(".bmp");
            var queryOptions = new QueryOptions(CommonFileQuery.OrderByName, fileTypeFilter);
            StorageFolder folderToGetPicsFrom = KnownFolders.PicturesLibrary;
            var query = folderToGetPicsFrom.CreateFileQueryWithOptions(queryOptions);
            IReadOnlyList<StorageFile> fileList = await query.GetFilesAsync();
            // Process results
            ObservableCollection<BitmapImage> newList = new ObservableCollection<BitmapImage>();
            foreach (StorageFile file in fileList)
            {
                // Process file
                BitmapImage src = new BitmapImage( uriSource : new Uri(file.Path));
               // src.UriSource = new Uri(file.Path, UriKind.Absolute);
                src.SetSource(await file.OpenAsync(FileAccessMode.ReadWrite));
                newList.Add(src);
            }
            Images = newList;
        }
4

1 回答 1

1

我怀疑将任意文件的 BitmapImage.UriSource 设置为 new Uri(file.Path)) 正在做任何事情,并且通过调用 SetSource - 您基本上是在覆盖该错误设置。通常,如果您将 UriSource 设置为有效的源 - 您无需在之后调用 SetSource - 这是加载图像的两种不同方法。

除了使用 ObservableCollection,您还可以使用 ObservableCollection 之类的东西,其中 ItemViewModel 具有 BitmapImage 和 StorageFile 的属性。然后你就拥有了将路径或文件传递到其他地方所需的一切。再说一遍 - 为什么不通过双击传递 BitmapImage 本身呢?如果您需要将图像作为 WriteableBitmap 打开的路径 - 为什么不从 WriteableBitmap 开始。如果您出于任何其他原因需要该路径 - 您只需向您的 ItemViewModel 添加一个属性。

于 2013-01-16T18:26:55.663 回答