有没有办法检测 Xamarin 表单中导航页面后退按钮的按下?
您可以覆盖导航页面"OnBackButtonPressed"方法:
protected override bool OnBackButtonPressed()
{
Device.BeginInvokeOnMainThread(async () =>
{
if (await DisplayAlert("Exit?", "Are you sure you want to exit from this page?", "Yes", "No"))
{
base.OnBackButtonPressed();
await App.Navigation.PopAsync();
}
});
return true;
}
如果您使用的是命令行管理程序,则可以覆盖命令行管理程序的 OnNavigating 事件:
void OnNavigating(object sender, ShellNavigatingEventArgs e)
{
// Cancel back navigation if data is unsaved
if (e.Source == ShellNavigationSource.Pop && !dataSaved)
{
e.Cancel();
}
}
更新:当用户按下硬件后退按钮时,OnBackButtonPressed 事件只会在 Android 上触发。
似乎您更有兴趣在任何页面消失时实现您想做某事! 在这种情况下: 您有页面的两种方法 -
protected override void OnAppearing()
{
base.OnAppearing();
Console.WriteLine("Hey, Im coming to your screen");
}
protected override void OnDisappearing()
{
base.OnDisappearing();
Console.WriteLine("Hey, Im going from your screen");
}
您可以在任何页面上覆盖这 2 种方法,以跟踪它们何时出现和消失。
最近对 Xamarin 窗体的更新意味着你现在可以在使用命令行管理程序导航制作的应用程序中执行此操作,以便在两个平台上导航后退箭头。
例如,使用 Shell.SetBackButtonBehavior 方法,在页面对象的构造函数中运行此代码将允许仅在绑定视图模型不繁忙时才进行后退导航:
Shell.SetBackButtonBehavior(this, new BackButtonBehavior
{
Command = new Command(async() =>
{
if (ViewModel.IsNotBusy)
{
await Shell.Current.Navigation.PopAsync();
}
})
});
在命令的正文中,您可以执行拦截后退按钮单击时需要执行的任何操作。
- 请注意,这只会影响导航后退按钮,而不会影响 Android 硬件后退按钮 - 根据上述答案需要单独处理。您可以编写一个共享方法,从按下的后退按钮覆盖和 shell 后退按钮行为位置的命令调用,以共享逻辑。
必须使用自定义呈现器覆盖本机导航栏按钮行为。按下的按钮仅触发物理设备按钮。你可以在这里阅读如何实现这一点的好文章