【问题标题】:How to show "up" / "back" button in Xamarin.Forms?如何在 Xamarin.Forms 中显示“向上”/“返回”按钮?
【发布时间】:2016-07-03 03:21:18
【问题描述】:

我正在尝试解决如何在 Xamarin.Forms 中显示“向上”箭头而不将页面推入堆栈。 IE。我只想在按下后退按钮时执行一个动作。我完全坚持这一点,所以任何帮助将不胜感激。

我尝试创建一个自定义渲染器来处理名为DisplayHomeAsBack 的视图属性。在渲染器中调用以下内容:

FormsAppCompatActivity context = ((FormsAppCompatActivity)Forms.Context);
Android.Support.V7.App.ActionBar actionBar = context.SupportActionBar;
if (actionBar != null)
{
  actionBar.SetDisplayHomeAsUpEnabled(element.DisplayHomeAsBack);
}

不幸的是,尽管所有在线教程和 android 的 stackoverflow 问题都建议使用这种方法,但这似乎完全没有任何作用。

计划是我可以在 MasterDetailPage 中使用“OnBackButtonPressed”覆盖,这应该允许我执行此操作。不幸的是,到目前为止,显示返回按钮是一个更大的障碍!

有没有更好的方法来做到这一点,或者我如何才能让当前的机制发挥作用?

编辑

如果有帮助,我已经创建了一个项目并将其上传到 Xamarin 支持论坛上的这个问题。 http://forums.xamarin.com/discussion/comment/186330#Comment_186330

【问题讨论】:

  • 我认为这取决于您尝试覆盖后退按钮图标的位置。听起来您正试图覆盖MasterDetailPage 上的后退按钮图标,我假设它位于NavigationPage 中?另外,这是MasterDetailPage 导航堆栈中的第一页还是您必须单击其他页面才能到达它?最后,您只想更改单击它时执行的操作,而不是更改按钮实际看起来正确的样子?
  • 我想我只是在使用静态(在上面的代码中),所以我认为这并不重要,但我可能错过了一些东西。你是对的,我有一个 MasterDetailPage,它有一个 NavigationPage 作为它的细节。 MasterDetailPage 是应用程序的主页。为了让您了解我正在尝试做什么,我提出了一个内部视图,我希望该视图在按下后退按钮时消失(因此需要更改图标和行为)。如果可行的话,我很乐意以任何其他方式做到这一点。
  • 您是否尝试过在MainActivity 中覆盖OnOptionItemsSelected?您可以找出要检查的菜单项 ID,然后使用 MessagingCenter 表示是时候执行您的自定义操作并在 OnOptionItemsSelected 中返回 false 以表示您正在自己处理它。如果这不起作用,那么您可能必须覆盖默认的后退按钮并实现自己的。
  • 但这不会将图标更改为背面?
  • 好的,所以您确实想更改图标的外观。然后我认为您需要覆盖OnCreateOptionsMenu 以更改图标的外观以及单击时的行为。当我有机会发布我的OnCreateOptionsMenu 的答案时,我正在添加一个自定义图标,而不仅仅是尝试重新添加箭头,因此它可能会有所不同。我想您也可以将一个新页面推送到屏幕上,但它看起来完全一样,只是它显示了您的自定义视图......然后您将获得返回按钮并且它会起作用

标签: android xamarin xamarin.android xamarin.forms android-appcompat


【解决方案1】:

抱歉让您久等了!

警告我实际上并没有运行此代码,而是从我自己的代码中更改了它,所以如果它在没有任何更改的情况下完美运行,我会感到惊讶。

所以下面应该在之前没有返回按钮的地方添加一个返回按钮(就像没有真正的页面可以返回时一样),然后我们将添加一个自定义操作以在按下它时执行。

我建议你在不使用动画的情况下将新页面推送到堆栈上,这样它对用户来说是透明的,也让这一切变得更简单,但如果你绝对不想这样做,下面的方法应该可以工作。

主活动:

//Use this to subscribe to the event which will create the back button
public override bool OnCreateOptionsMenu(IMenu menu) {

    if(menu != null && App.AppMasterPage != null) { //You will need this to make sure you are on your MasterDetailPage, just store a global reference to it in the App class or where ever

        Xamarin.Forms.MessagingCenter.Unsubscribe<string>(this, "CreateBackButton");
        Xamarin.Forms.MessagingCenter.Subscribe<string>(this, "CreateBackButton", stringWeWillNotUse => { //Use this to subscribe to the event that creates the back button, then when you want the back button to show you just run Xamarin.Forms.MessagingCenter.Send<string>(this, "CreateBackButton")

            ActionBar.DisplayOptions = ActionBarDisplayOptions.ShowTitle | ActionBarDisplayOptions.ShowHome | ActionBarDisplayOptions.UseLogo | ActionBarDisplayOptions.HomeAsUp; //You may need to play with these options to get it working but the important one is 'HomeAsUp' which should add the back button
        });
    } else {
        Xamarin.Forms.MessagingCenter.Unsubscribe<string>(this, "CreateBackButton");
    }

    return base.OnCreateOptionsMenu(menu);
}

现在下一步是在按下它时执行自定义操作。我认为您可以在MainActivity 中覆盖OnBackPressed() 或OnOptionsItemSelected(),或者您可以覆盖MasterDetailPage 方法。我不确定。

哪一个对你有用,在那个覆盖范围内,我会简单地检查你是否像我们上面所做的那样在你的App.AppMasterPage 上,如果是,发送你的App.AppMasterPage 有的MessagingCenter 消息已经订阅,以便它处理自定义操作。

如果您遇到困难,请告诉我!

【讨论】:

  • 感谢您的帮助,这最终并没有直接帮助我,但我确实从我们的讨论中得到了这个想法。请参阅我用作其他答案的解决方案。
  • @Blueberry 听起来不错!很高兴我能帮忙。就可维护性和复杂性而言,我认为这比我上面的答案要少得多。
【解决方案2】:

我知道这听起来有点像 hack,但到目前为止我发现的最好的“解决方案”是在当前页面后面(根目录后面)添加一个页面,这样它就不可见了。然后当用户按下后退按钮时,通过删除该页面来处理它。

【讨论】:

    猜你喜欢
    • 2014-09-02
    • 2012-07-02
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多