我正在使用Xamairn.Forms,如何在以下情况下禁用导航栏中的后退按钮
ViewList
正在刷新。
实际上,我正在使用以下代码来禁用默认后退按钮,但现在我正在尝试找到方法来禁用导航栏后退按钮
protected override bool OnBackButtonPressed()
{
if (ListView.IsRefreshing)
return true;
return false;
}
知道如何禁用导航栏中的后退按钮吗?
最佳答案
总的来说,Android 和 iOS 没有正常的 API 来阻止执行导航栏后退按钮,原因有一个,即用户希望能够返回,而您不应该阻止他们这样做。
您应该更改您的设计,仅向用户提供您希望他们能够完全制作或隐藏导航栏的选项,并使用您自己的按钮创建您自己的导航栏。
Adam's guide提供了对该主题的一个很好的概述,我希望在面对这个问题时能够找到它。
他建议了我刚才做的同样的事情,但也提供了非常hacky的方法来防止如果你拒绝改变你的设计就返回(下面的代码从上面链接的文章中大部分没有改变):
在 Android 上,您可以尝试找到后退按钮并使用 ContentPage
的 ViewModel 方法来确定是否允许返回。您可以在 MainActivity
中覆盖 OnOptionsItemSelected
:
public override bool OnOptionsItemSelected(IMenuItem item) {
var app = Application.Current;
if (item.ItemId == 16908332) { // This makes me feel dirty.
var navPage = ((app.MainPage.Navigation.ModalStack[0] as MasterDetailPage).Detail as NavigationPage); // Notice this code assumes it is looking for a MasterDetailPage being shown as a modal
if (app != null && navPage.Navigation.NavigationStack.Count > 0) {
int index = navPage.Navigation.NavigationStack.Count - 1;
var currentPage = navPage.Navigation.NavigationStack[index];
var vm = currentPage.BindingContext as ViewModel; //You would want to cast this to a base ViewModel or a specific one so that OnBackButtonPressed() can be called
if (vm != null) {
var answer = vm.OnBackButtonPressed();
if (answer) {
return true;
}
}
}
}
return base.OnOptionsItemSelected(item);
}
在 iOS 上,您需要一个自定义渲染器来将真正的后退按钮切换为您自己的自定义按钮:
[assembly: ExportRenderer(typeof(Page), typeof(CustomPageRenderer))]
namespace Mobile.iOS.CustomRenderer {
public class CustomPageRenderer : PageRenderer {
public override void ViewWillAppear(bool animated) {
base.ViewWillAppear(animated);
var page = Element as CorePage;
if (page != null) {
if ((page).OverrideBackButton) {
var root = this.NavigationController.TopViewController;
// NOTE: this doesn't look exactly right, you need to create an image to replicate the back arrow properly
root.NavigationItem.SetLeftBarButtonItem(new UIBarButtonItem("< Back", UIBarButtonItemStyle.Plain, (sender, args) => {
var navPage = page.Parent as NavigationPage;
var vm = page.BindingContext as ViewModel;
if (vm != null) {
var answer = vm.OnBackButtonPressed();
if (!answer)
navPage.PopAsync();
} else {
navPage.PopAsync();
}
}), true);
}
}
}
}
}
在 Windows Phone 上...只需覆盖 OnBackButtonPressed
...使用 WP 实际上非常简单。
关于Xamarin.Forms 如何禁用导航栏中的后退按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41978276/