Xamarin.forms浏览另一个页面后如何保持同一页上的图像(Xamarin.forms how

2019-11-04 07:08发布

我已经上传了我的个人资料页上的图像,我想直到我xamarin形式退出来保存图像。

如果我选择另一页,所以我想抱着它,直到我登出我的图像都将丢失。

var profile = new Image { };
profile.Source = "profile.png";
profile.HorizontalOptions = LayoutOptions.StartAndExpand;
profile.VerticalOptions = LayoutOptions.StartAndExpand;

var profiletap = new TapGestureRecognizer();

profiletap.Tapped += async (s, e) =>
{
    var file = await CrossMedia.Current.PickPhotoAsync();
    if (file == null)
        return;
    await DisplayAlert("File Location", file.Path, "OK");

    im = ImageSource.FromStream(() =>
    {
        var stream = file.GetStream();
        //file.Dispose();
        return stream;
    });

    profile.Source = im;

//   await Navigation.PushModalAsync(new PhotoPage(im));
};

profile.GestureRecognizers.Add(profiletap);

Answer 1:

页面导航到另一个页面时和回来不被摧毁,这就是为什么一个页面的构造函数只被执行的第一次显示。 所以,我不知道,当你说你要认为像你的意思。

说了这么多,你总是可以分配整个profile变量为static全局变量在你的App像下面类,以便它保持不变,不管是什么。 然后,你就必须分配/在正确的时间初始化的全局变量。

但同样,我不知道这是必要的,那么你可以尝试更多地解释什么问题居然是:

App类:

public class App : Application {

    public static Image ProfileImage = new Image {
        Source            = "profile.png",
        HorizontalOptions = LayoutOptions.StartAndExpand,
        VerticalOptions   = LayoutOptions.StartAndExpand
    };
    ....
}

然后在你的页面:

public class ProfilePage : ContentPage {

    public ProfilePage() {

        ....

        App.ProfileImage.GestureRecognizers.Add(profiletap);
    }

}

编辑:见我的答案在这里使用一个插件,允许用户选择从他们的设备的相机胶卷照片的一个例子。 一旦你的照片路径,你可以简单地使用HttpClient发送图像和一个base64字符串。 还有许多其他的例子网上有关如何做到这一点。

编辑#2:这行代码后:

var file = await CrossMedia.Current.PickPhotoAsync();

您现在有文件和路径file变量。 所以目前你正在做的是使用了图像ImageSource.FromStream但为了继续显示图像当您返回到该页面,您还需要将图像保存到设备中。 为了做到这一点,你需要写在每个项目的平台特定的代码和参考,在你的共享代码。 事情是这样的:

在你的iOS和Android项目,创建一个新文件( FileHelper_Android.csFileHelper_iOS.cs为例),并添加以下(相同的代码可以被添加到iOS和Android的文件,只是改变了类文件的名称:

using ....;

[assembly: Dependency(typeof(FileHelper_Android))]

namespace YourNamespace.Droid{

    /// <summary>
    /// Responsible for working with files on an Android device.
    /// </summary>
    internal class FileHelper_Android : IFileHelper {

        #region Constructor

        public FileHelper_Android() { }

        #endregion

        public string CopyFile(string sourceFile, string destinationFilename, bool overwrite = true) {

            if(!File.Exists(sourceFile)) { return string.Empty; }
            string fullFileLocation = Path.Combine(Environment.GetFolderPath (Environment.SpecialFolder.Personal), destinationFilename);
            File.Copy(sourceFile, fullFileLocation, overwrite);
            return fullFileLocation;
        }
    }
}

做同样的iOS和只需更改文件名。 现在,在您的共享项目,您需要创建IFileHelper.cs像这样:

public interface IFileHelper {

    string CopyFile(string sourceFile, string destinationFilename, bool overwrite = true);

}

最后,在你的页面,你会写:

_fileHelper = _fileHelper ?? DependencyService.Get<IFileHelper>();

profiletap.Tapped += async (s, e) =>
{
    var file = await CrossMedia.Current.PickPhotoAsync();
    if (file == null)
        return;
    await DisplayAlert("File Location", file.Path, "OK");

    profile.Source = im;

    imageName = "SomeUniqueFileName" + DateTime.Now.ToString("yyyy-MM-dd_hh-mm-ss-tt");
    filePath  = _fileHelper.CopyFile(file.Path, imageName);

    im = ImageSource.FromFile(filePath)

//   await Navigation.PushModalAsync(new PhotoPage(im));
};

以上,一旦用户选择了文件,我们在本地复制该文件,并在我们还设置你的im变量设置为新的本地文件路径,这会从返回的IFileHelper.CopyFile方法。

你仍然需要处理的情况下,当用户回来的网页或打开应用程序,然后再打开。 在这种情况下,你需要加载保存的图像路径。 我建议无论是图像路径保存到数据库,除非用户将只具有单一的个人资料图片,那么你总是可以只加载相同的路径和文件名。 让我知道如果你仍然有问题。



文章来源: Xamarin.forms how to hold image on same page after navigating another page