我正在努力研究如何展示" 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
答案 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)
我知道这听起来有点像黑客,但到目前为止我发现的最好的“解决方案”是在当前页面后面(在根目录后面)添加一个页面,因此它不可见。然后当用户按下后退按钮时,通过删除该页面来处理它。