如何在 Xamarin.Forms 中显示 "up" / "back" 按钮?
How to show "up" / "back" button in Xamarin.Forms?
我正在尝试研究如何在 Xamarin.Forms 中显示 "up" 箭头,而无需将页面推入堆栈。 IE。我只想在按下后退按钮时执行一个动作。我完全坚持这一点,所以任何帮助将不胜感激。
我尝试创建一个自定义渲染器来处理名为 DisplayHomeAsBack
的视图 属性。在渲染器中调用以下内容:
FormsAppCompatActivity context = ((FormsAppCompatActivity)Forms.Context);
Android.Support.V7.App.ActionBar actionBar = context.SupportActionBar;
if (actionBar != null)
{
actionBar.SetDisplayHomeAsUpEnabled(element.DisplayHomeAsBack);
}
不幸的是,尽管 android 的所有在线教程和 Whosebug 问题都建议使用这种方法,但这似乎完全没有任何作用。
计划是我可以在 MasterDetailPage 中使用 "OnBackButtonPressed" 覆盖,这应该允许我执行此操作。不幸的是,显示后退按钮是迄今为止最大的障碍!
是否有更好的方法或如何让当前机制发挥作用?
编辑
我已经创建了一个项目并将其上传到 Xamarin 支持论坛上的这个问题,如果有帮助的话。
http://forums.xamarin.com/discussion/comment/186330#Comment_186330
抱歉让您久等了!
警告我实际上并没有 运行 这段代码,而是从我自己的代码中更改了它,所以如果它在没有一些更改的情况下完美运行,我会感到惊讶。
所以下面应该在之前没有的地方添加一个后退按钮(就像当没有真正要返回的页面时一样)然后我们将添加一个自定义操作以在按下时执行。
我建议你在不使用动画的情况下将新页面推送到堆栈上,这样它对用户来说是透明的,也使所有这一切变得更加简单,但如果你绝对不想这样做,下面的方法应该工作。
主要活动:
//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
上,如果是的话,发送一条 MessagingCenter
消息您的 App.AppMasterPage
已经订阅,以便它处理自定义操作。
如果您遇到困难,请告诉我!
我知道这听起来有点不对劲,但是 "solution" 目前我发现的最好的方法是在当前页面后面(在根目录后面)添加一个页面,这样它就看不见了。然后当用户按下后退按钮时,通过删除该页面来处理它。
我正在尝试研究如何在 Xamarin.Forms 中显示 "up" 箭头,而无需将页面推入堆栈。 IE。我只想在按下后退按钮时执行一个动作。我完全坚持这一点,所以任何帮助将不胜感激。
我尝试创建一个自定义渲染器来处理名为 DisplayHomeAsBack
的视图 属性。在渲染器中调用以下内容:
FormsAppCompatActivity context = ((FormsAppCompatActivity)Forms.Context);
Android.Support.V7.App.ActionBar actionBar = context.SupportActionBar;
if (actionBar != null)
{
actionBar.SetDisplayHomeAsUpEnabled(element.DisplayHomeAsBack);
}
不幸的是,尽管 android 的所有在线教程和 Whosebug 问题都建议使用这种方法,但这似乎完全没有任何作用。
计划是我可以在 MasterDetailPage 中使用 "OnBackButtonPressed" 覆盖,这应该允许我执行此操作。不幸的是,显示后退按钮是迄今为止最大的障碍!
是否有更好的方法或如何让当前机制发挥作用?
编辑
我已经创建了一个项目并将其上传到 Xamarin 支持论坛上的这个问题,如果有帮助的话。 http://forums.xamarin.com/discussion/comment/186330#Comment_186330
抱歉让您久等了!
警告我实际上并没有 运行 这段代码,而是从我自己的代码中更改了它,所以如果它在没有一些更改的情况下完美运行,我会感到惊讶。
所以下面应该在之前没有的地方添加一个后退按钮(就像当没有真正要返回的页面时一样)然后我们将添加一个自定义操作以在按下时执行。
我建议你在不使用动画的情况下将新页面推送到堆栈上,这样它对用户来说是透明的,也使所有这一切变得更加简单,但如果你绝对不想这样做,下面的方法应该工作。
主要活动:
//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
上,如果是的话,发送一条 MessagingCenter
消息您的 App.AppMasterPage
已经订阅,以便它处理自定义操作。
如果您遇到困难,请告诉我!
我知道这听起来有点不对劲,但是 "solution" 目前我发现的最好的方法是在当前页面后面(在根目录后面)添加一个页面,这样它就看不见了。然后当用户按下后退按钮时,通过删除该页面来处理它。