如何共享已消耗的内存流

本文关键字:内存 何共享 共享 | 更新日期: 2023-09-27 18:36:01

我需要在 Xamarin.Forms 应用的不同页面之间共享图像。

在页面上加载图像后,我无法重复使用图像源和流。因此,我也需要在其他页面上加载相同的图像。

我在这里发布了一个相关问题。

下面是一些代码:

public PhotoCapturedViewModel(IScreen screen, Stream stream) : base(screen, "")
{
    Photo = ImageSource.FromStream(() => stream); // This stream was already used on another page
    Apply = new DelegateCommand(_ => Publish(APPLY_PHOTO, new RenderedPhoto(stream, Description)));
}

如何共享已消耗的内存流

我通过立即将最近创建的流转换为字节数组来解决我的问题。

然后,我通过传递字节数组来生成新的内存流。

创造:

var file = await service.TakePhotoAsync(mediaOptions);
var stream = file.GetStream();
using (var memoryStream = new MemoryStream())
{
    stream.CopyTo(memoryStream);
    var image = memoryStream.ToArray();
    Publish(PHOTO_CAPTURED, new ImageCaptureNavigationArgs(image));
}

导航:

static void OnPhotoCaptured(object obj)
{
    var args = obj as ImageCaptureNavigationArgs;
    var screen = IOCServiceRegistration<IUnityContainer>.Container.Resolve(typeof(IScreen)) as IScreen; // ReactiveUI dependency kludge. Sigh...
    screen.Router.Navigate.Execute(new PhotoCapturedViewModel(screen, args.Stream));
}

用法:

public partial class PhotoCapturedViewModel : BaseViewModel
{
    public PhotoCapturedViewModel(IScreen screen, byte[] image) : base(screen, "")
    {
        var memoryStream = new MemoryStream(image);
        Photo = ImageSource.FromStream(() => memoryStream);
        Apply = new DelegateCommand(_ => Publish(APPLY_PHOTO, new RenderedPhoto(image, Description)));
    }

我解决这个问题的方法不是使用相同的流,而是简单地将新图像源设置为原始图像的源。

尝试这样的事情:

public PhotoCapturedViewModel(IScreen screen, Image originalImage) :     base(screen, "")
{
    Photo = new Image() {Source = originalImage.Source};
}