如何展示" up" /"返回" Xamarin.Forms中的按钮?

时间:2016-03-17 00:09:34

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

我正在努力研究如何展示" up" Xamarin.Forms中的箭头没有将页面推入堆栈。 I.E.我只想在按下后退按钮时执行操作。我完全坚持这一点,所以任何帮助都会受到赞赏。

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

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

不幸的是,这似乎绝对没有,即使所有在线教程和android的stackoverflow问题都提示这种方法。

计划是我可以使用" OnBackButtonPressed"在MasterDetailPage中覆盖,这应该允许我执行此操作。不幸的是,显示后退按钮是迄今为止最大的障碍!

是否有更好的方法来实现这一目标或如何让当前的机制发挥作用?

修改

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

2 个答案:

答案 0 :(得分:1)

很抱歉让你久等了!

警告我实际上没有运行此代码并将其从我自己的代码中更改,所以如果没有一些更改它会完美运行我会感到惊讶。

所以下面应该添加一个之前没有一个的后退按钮(所以当没有真正的页面可以返回时),然后我们将添加一个自定义动作,以便在按下时执行。

我建议您在不使用动画的情况下将新页面推送到堆栈,这样对用户来说是透明的,并且使所有这些变得更加简单,但如果您绝对不想这样做,则下面的方法应该可行。

MainActivity:

//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);
}

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

哪一个适合您,在该覆盖范围内,我只是检查您是否在App.AppMasterPage上,就像我们上面所做的那样,如果是,请发送MessagingCenter消息App.AppMasterPage已订阅,以便其处理自定义操作。

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

答案 1 :(得分:0)

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