我们有一个Xamarin窗体应用程序,它有一个选项卡视图。在其中一个选项卡中,我们打开一个新的内容页,它需要有一个选项来选择文件和上传附件。使用Xamarin.Essentials FilePicker,我们可以选择文件并读取文件内容,但是在读取文件之后,应用程序自动导航到主屏幕--就像应用程序重新启动一样。
我们已经观察到,当文件选择器打开时,App.xaml.cs中的App.xaml.cs被调用,当文件被读取,选择器被取消时,App.xaml.cs中的恢复文件就会被调用。这似乎会导致XForms应用程序完全重新启动。
所有权限都到位了--我们的目标是Android9.0,使用的是XForms版本4.8,X.Essentials版本1.6。
你能帮忙吗?
相关守则:
try
{
var file = await FilePicker.PickAsync();
if (file != null)
{
var stream = await file.OpenReadAsync();
byte[] FileData = new byte[stream.Length];
await stream.ReadAsync(FileData, 0, (int)(stream.Length - 1));
fileData = Convert.ToBase64String(FileData);
fileStream = new MemoryStream(FileData);
FileNameVisibility = true;
FileName = file.FileName;
}
}
catch (Exception ex)
{
Crashes.TrackError(ex);
}发布于 2022-01-08 22:37:23
测试文档中的代码片段。
此代码适用于我:
FilePickerPage.xaml:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XFSOAnswers.FilePickerPage">
<ContentPage.Content>
<StackLayout>
<Button Text="Pick File" Clicked="PickFileButton_Clicked" />
<Label x:Name="FileName" />
<Image x:Name="FileImage" />
</StackLayout>
</ContentPage.Content>
</ContentPage>FilePickerPage.xaml.cs:
using System;
using System.Threading.Tasks;
using Xamarin.Essentials;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace XFSOAnswers
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class FilePickerPage : ContentPage
{
public FilePickerPage()
{
InitializeComponent();
}
private void PickFileButton_Clicked(object sender, EventArgs e)
{
Device.BeginInvokeOnMainThread(async () =>
{
await PickAndShow(PickOptions.Images);
});
}
async Task<FileResult> PickAndShow(PickOptions options)
{
try
{
var result = await FilePicker.PickAsync(options);
if (result != null)
{
FileName.Text = $"File Name: {result.FileName}";
if (result.FileName.EndsWith("jpg", StringComparison.OrdinalIgnoreCase) ||
result.FileName.EndsWith("png", StringComparison.OrdinalIgnoreCase))
{
var stream = await result.OpenReadAsync();
FileImage.Source = ImageSource.FromStream(() => stream);
}
}
return result;
}
catch (Exception ex)
{
// The user canceled or something went wrong
_ = ex;
}
return null;
}
}
}App.xaml.cs:
...
MainPage = new StartPage();StartPage:
... had a button to go to FilePickerPage.因此,StartPage在堆栈上,然后是FilePickerPage。
在完成FilePicker之后,FilePickerPage仍然显示-带有文件名和图像:

MainActivity.cs:
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
...
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}注意:上面的MainActivity代码应该会自动出现在任何新的Xamarin表单项目中;只有当这是一个旧的项目时,它才会丢失,然后由项目模板自动添加Essential。
那么,如何调试您的代码。
if (file != null) { ... }当评论被删除时,会不会崩溃?
Device.BeginInvokeOnMainThread( async () => {
... YOUR CODE ...
});也许您的导航堆栈是空的?当FilePicker关闭时,可能没有地方可以回去了。
https://stackoverflow.com/questions/70632689
复制相似问题