Xamarin.forms如何在导航另一个页面后将图像保持在同一页面上



我已经在我的个人资料页面上传了图像,我想保留该图像,直到我以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变量分配给App类中的static全局变量,如下所示,这样无论发生什么情况,它都保持不变。然后,您必须在正确的时间分配/初始化全局变量。

但是,我不确定这是否有必要,所以你可以试着解释更多的问题:

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方法返回。

当用户返回页面或再次关闭应用程序时,您仍然需要处理这种情况。在这种情况下,您需要加载保存的图像路径。我建议将图像路径保存到DB中,除非用户只有一个配置文件图像,否则您可以始终加载相同的路径和文件名。如果您还有问题,请告诉我。

最新更新