将 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
可能更合适(应无限期保留的文件)。
我有一个表格要填写数据,包括一张图像,然后进入列表视图。当我单击一个按钮以获取图像时,它可以工作并进入表单,但是当我单击另一个按钮将其添加到列表视图时,出现错误 [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
可能更合适(应无限期保留的文件)。