gpt4 book ai didi

xamarin - 如何在Xamarin Forms中处理/取消向后导航

转载 作者:行者123 更新时间:2023-12-03 15:11:04 25 4
gpt4 key购买 nike

我试图通过覆盖OnBackButtonPressed来使用向后导航,但是以某种方式根本没有调用它。我正在使用ContentPage和最新的1.4.2版本。

最佳答案

好了,几个小时后,我发现了这个问题。它分为三个部分。

#1处理Android上的硬件后退按钮。这很简单,重写OnBackButtonPressed。请记住,这仅适用于硬件后退按钮和android。它不会处理导航栏的后退按钮。如您所见,在退出页面之前,我试图通过浏览器进行备份,但是您可以放入所需的任何逻辑。

  protected override bool OnBackButtonPressed()
{
if (_browser.CanGoBack)
{
_browser.GoBack();
return true;
}
else
{
//await Navigation.PopAsync(true);
base.OnBackButtonPressed();
return true;
}
}

#2 iOS导航后退按钮。这确实很棘手,如果您在网上浏览时,会看到几个用新的自定义按钮替换后退按钮的示例,但是要使其看起来像其他页面几乎是不可能的。在这种情况下,我制作了一个透明按钮,该按钮位于普通按钮的顶部。
[assembly: ExportRenderer(typeof(MyAdvantagePage), typeof

(MyAdvantagePageRenderer))]
namespace Advantage.MyAdvantage.MobileApp.iOS.Renderers
{
public class MyAdvantagePageRenderer : Xamarin.Forms.Platform.iOS.PageRenderer
{
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);

if (((MyAdvantagePage)Element).EnableBackButtonOverride)
{
SetCustomBackButton();
}
}
private void SetCustomBackButton()
{
UIButton btn = new UIButton();
btn.Frame = new CGRect(0, 0, 50, 40);
btn.BackgroundColor = UIColor.Clear;

btn.TouchDown += (sender, e) =>
{
// Whatever your custom back button click handling
if (((MyAdvantagePage)Element)?.
CustomBackButtonAction != null)
{
((MyAdvantagePage)Element)?.
CustomBackButtonAction.Invoke();
}
};
NavigationController.NavigationBar.AddSubview(btn);
}
}
}

Android,很棘手。在旧版本的Forms和将来的Forms中,一旦修复,您可以像这样简单地覆盖选择的OnOptionsItem
       public override bool OnOptionsItemSelected(IMenuItem item)
{
// check if the current item id
// is equals to the back button id
if (item.ItemId == 16908332)
{
// retrieve the current xamarin forms page instance
var currentpage = (MyAdvantagePage)
Xamarin.Forms.Application.
Current.MainPage.Navigation.
NavigationStack.LastOrDefault();

// check if the page has subscribed to
// the custom back button event
if (currentpage?.CustomBackButtonAction != null)
{
// invoke the Custom back button action
currentpage?.CustomBackButtonAction.Invoke();
// and disable the default back button action
return false;
}

// if its not subscribed then go ahead
// with the default back button action
return base.OnOptionsItemSelected(item);
}
else
{
// since its not the back button
//click, pass the event to the base
return base.OnOptionsItemSelected(item);
}
}

但是,如果您使用的是FormsAppCompatActivity,则需要在MainActivity中添加到OnCreate上以设置工具栏:
Android.Support.V7.Widget.Toolbar toolbar = this.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
SetSupportActionBar(toolbar);

可是等等!如果您使用的.Forms版本太旧或太新,工具栏为null的地方都会出现一个错误。如果发生这种情况,那么我要努力制定一个截止日期的方法就是这样。在 OnCreate中的 MainActivity中:
        MobileApp.Pages.Articles.ArticleDetail.androdAction = () =>
{
Android.Support.V7.Widget.Toolbar toolbar = this.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
SetSupportActionBar(toolbar);
};

如果平台是我页面上的Android,ArticleDetail是一个页面,而androidAction是我在OnAppearing上运行的 Action。此时,在您的应用中,工具栏将不再为空。

再加几个步骤,我们上面制作的iOS渲染使用的属性需要添加到要为其制作渲染器的任何页面上。我正在为我制作的实现ContentPage的 MyAdvantagePage类创建它。所以我在 MyAdvantagePage类中添加了
public Action CustomBackButtonAction { get; set; }

public static readonly BindableProperty EnableBackButtonOverrideProperty =
BindableProperty.Create(
nameof(EnableBackButtonOverride),
typeof(bool),
typeof(MyAdvantagePage),
false);

/// <summary>
/// Gets or Sets Custom Back button overriding state
/// </summary>
public bool EnableBackButtonOverride
{
get
{
return (bool)GetValue(EnableBackButtonOverrideProperty);
}
set
{
SetValue(EnableBackButtonOverrideProperty, value);
}
}

现在已经完成了,在我的任何 MyAdvantagePage上我都可以添加
:


this.EnableBackButtonOverride = true;
this.CustomBackButtonAction = async () =>
{
if (_browser.CanGoBack)
{
_browser.GoBack();
}
else
{
await Navigation.PopAsync(true);
}
};

那应该是使它能够在Android硬件上运行以及在android和iOS上导航返回的一切。

关于xamarin - 如何在Xamarin Forms中处理/取消向后导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30657344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com