我已经上传了我的个人资料页上的图像,我想直到我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);
页面导航到另一个页面时和回来不被摧毁,这就是为什么一个页面的构造函数只被执行的第一次显示。 所以,我不知道,当你说你要认为像你的意思。
说了这么多,你总是可以分配整个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.cs
和FileHelper_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
方法。
你仍然需要处理的情况下,当用户回来的网页或打开应用程序,然后再打开。 在这种情况下,你需要加载保存的图像路径。 我建议无论是图像路径保存到数据库,除非用户将只具有单一的个人资料图片,那么你总是可以只加载相同的路径和文件名。 让我知道如果你仍然有问题。