【问题标题】:Xamarin Forms Wait for image to be saved and show itXamarin Forms 等待图像被保存并显示
【发布时间】:2020-04-13 01:11:17
【问题描述】:

我有问题。我有一个skiasharp,当我单击一个按钮时,我会将其转换为png。 这是代码:

async void OnButtonClicked(object sender, EventArgs args)
{
    using (var image = args.Surface.Snapshot())
    using (var data = image.Encode(SKEncodedImageFormat.Png, 80))
    using (var stream = File.OpenWrite(Path.Combine("MyApp.TempImages", "1.png")))
    {
        data.SaveTo(stream);
    }
}

但现在我真的想进入下一页。该页面包含一个图像,我想在其中显示保存的图像。首先,我在该页面上创建了一个这样的 ActivityIndi​​cator:

<ActivityIndicator Color="Red" IsRunning="true" />

所以我希望在加载图像时显示它。 问题是我不知道如何检查图像是否已保存,因此我可以将其分配给该页面上的图像源并删除 ActivityIndi​​cator。另外,我想在后台线程上运行图像保存,所以我不必等待它保存。

有人知道我该怎么做吗?

【问题讨论】:

  • 使用 File.Exists 查看文件是否已创建

标签: c# xamarin.forms xamarin.android xamarin.ios skiasharp


【解决方案1】:

我可能不会使用data.SaveTo(stream),而是使用data.AsStream(),并使用该流中的异步方法将其复制到FileStream。这样,您可以在该操作之前和之后切换 ActivityIndicator 的可见性。所以像:

async void OnButtonClicked(object sender, EventArgs args)
{
    // Show ActivityIndicator here

    using (var image = args.Surface.Snapshot())
    using (var data = image.Encode(SKEncodedImageFormat.Png, 80))
    using (var stream = File.OpenWrite(Path.Combine("MyApp.TempImages", "1.png")))
    {
        var dataStream = data.AsStream();
        await dataStream.CopyTo(stream);
        await stream.FlushAsync();
    }

    // Hide ActivityIndicator here
}

如果你给你的ActivityIndicator 一个名字x:Name="Indicator",你可以用它来显示/隐藏它。

如果您想在保存文件之前等待导航,只需这样做,而不是显示/隐藏指示器。

【讨论】:

  • 好的,但是 ActivityIndi​​cator 在下一页。那么我需要在那里添加什么代码来检查保存图像的任务是否完成?
  • 我会等待导航。或者将保存图像的任务移到某个地方,而不是它自己的页面,这样它就可以在你在应用程序中做其他事情的同时继续在后台运行。但是,这样保存图片操作是否需要显示一个ActivityIndi​​cator?
  • 我不知道,但我认为它是用户友好的?
猜你喜欢
  • 2016-06-15
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多