将 MediaPicker 图像添加到 ListView 会导致 System.ObjectDisposedException

Adding a MediaPicker image to ListView causes System.ObjectDisposedException

我有一个表格要填写数据,包括一张图像,然后进入列表视图。当我单击一个按钮以获取图像时,它可以工作并进入表单,但是当我单击另一个按钮将其添加到列表视图时,出现错误 [System.ObjectDisposedException:'无法访问已处置的对象。 对象名称:出现'Stream has been closed']。

感谢您的帮助

当我按下添加图像按钮时:

            var ActionPhoto = await DisplayActionSheet("Ajouter une pièce-jointe depuis:", "Annuler", null, "Galerie", "Caméra");
        switch (ActionPhoto)
        {
            case "Galerie":
                var Galerie = await MediaPicker.PickPhotoAsync(new MediaPickerOptions { Title = "Choisir une image" });
                if (Galerie != null)
                {
                    var voirImageGalerie = await Galerie.OpenReadAsync();
                    Image_Photos.Source = ImageSource.FromStream(() => voirImageGalerie);

                }
                break;

            
            case "Caméra":
                var camera = await MediaPicker.CapturePhotoAsync();
                if (camera != null)
                {
                    var voirImageCamera = await camera.OpenReadAsync();
                    Image_Photos.Source = ImageSource.FromStream(() => voirImageCamera); 
                }
                break;
        }

当我按下 listView 的添加按钮时:

App.listePosteNoteFrais.Add(new Data{PostePJ = Image_Photos.Source});

在我的数据中Class:

public ImageSource PostePJ { get; set; }

我要添加到列表视图的内容:

<Image x:Name="Image_PostePJ" Source="{Binding PostePJ}" HeightRequest="150" WidthRequest="150" Grid.Row="0" Grid.Column="12"/>

给出的代码:

    ImageSource.FromStream(() => voirImageCamera)

FromStream的参数:

    () => voirImageCamera

每次需要图像时执行。

异常信息:

System.ObjectDisposedException: 'Cannot access a disposed object. Object name: 'Stream has been closed.

告诉您流 (voirImageCamera) 不再可用。

我不确定是什么内部代码在处理该流。也许 MediaPicker 认为它不再需要了。或者可能是由于从一个图像源复制到另一个图像源。或者关于how/whenListView访问图片源的事情

doc Xamarin.Essentials: Media Picker / General Usage 所示,使用 MediaPicker OpenReadAsync 结果的一种安全方法是将流保存在本地文件中,然后将该文件用作图像源:

// save the file into local storage
    var newFile = Path.Combine(FileSystem.CacheDirectory, photo.FileName);
    using (var stream = await photo.OpenReadAsync())
    using (var newStream = File.OpenWrite(newFile))
        await stream.CopyToAsync(newStream);

然后将图像源设置为该文件:

Image_Photos.Source = ImageSource.FromFile(newFile);

FromFile 的优势在于它应该能够在需要的任何时候打开文件 - 没有 stream 保持打开状态。

注意:文档示例使用 CacheDirectory。根据情况,FileSystem.AppDataDirectory 可能更合适(应无限期保留的文件)。