为什么我的模态页面有后退按钮?

时间:2018-05-15 14:58:30

标签: c# xamarin.forms uwp

项目和问题解释

在我的情况下,我有一个页面,指示用户如何移动某台机器。此页面应该是一个模态页面,因为在不执行或完全取消操作的情况下不应导航页面。

enter image description here 我有一个带有列表视图的主页,打开列表视图中包含的任何项目的详细信息页面,点击onSelect方法:

Navigation.PushAsync(new FooPage(string Name)); /* gets called in the 
onSelect method if selection is not null*/

在将名称传递给详细信息页面的viewmodel之后,在详细信息页面的viewmodel中检索模型,然后使用注入viewmodel的模型管理器与Unity进行检索。

- 我们现在在堆栈上都有一个主页和详细信息页面,其中只有详细信息页面有一个后退按钮 -

在详细信息页面上,我们有一个名为“Teach”的按钮,点击它之后旁边有一个x,y,z字段,此方法被调用:

private async Task Button_Clicked(object sender, EventArgs e)
        {
            await Navigation.PushModalAsync(new ManualTeachPage());
        }

然后,它应该创建页面,但由于某种原因决定添加一个后退按钮: Uwp backbutton is visible

调试和研究

此行为在Android上不可见,此页面上没有可见的后退按钮或导航栏,但在详细信息页面上也有后退按钮。

之前我使用过模态页面,但我从未见过这种行为,我尝试过使用Application.Mainpage本身的Navigation属性,除了一种情况外,结果完全相同。

我认为这可能与我在某一点切换Application.Mainpage有关(用户必须经过一堆教程页面),似乎是在设置新主页后调用pushModalAsync一行然后它将页面作为模态页面推送并执行一个(没有后退按钮)但在此之后不这样做。

就我所见,没有关于Bugzilla的错误报告,我也没有在互联网上找到关于这个特定问题的任何内容。

请注意,单击教学页面上的后退按钮时,它将返回详细信息页面。当教书页面被推送时,它实际上会被推到ModalStack上。

更新1

再次检查我所谈论的模态页面是模态堆栈上唯一的模态页面,它是。 NavigationPage.SetHasBackButton(this,false);似乎没有像Diego Rafael Souza所建议的那样有效。

更新2

我想我会在教学页面中使用onBackButtonPressed暂时禁用后退按钮,直到找到解决方案。事实证明这不再适用于UWP,此方法不再在此页面或任何页面上调用此方法。它虽然适用于Android硬件按钮。

更新3

我尝试使用:

SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = 
AppViewBackButtonVisibility.Collapsed;

这确实隐藏了UWP上的后退按钮但由于某种原因#if WINDOWS_UWP根本不起作用。如果我在没有#if的情况下执行此操作,程序将无法为Android构建。还没有解决方案,不仅如此,但在使用此修复程序时,其他页面仍然禁用了onBackButtonPressed方法。

更新4

更新到最新版本的xamarin后,OnBackButtonPressed再次开始工作。后退按钮仍显示在页面上,但我现在已将其禁用。

重新创建问题

我在这个小测试项目中重新创建了这个问题: https://www.dropbox.com/sh/6btsud3uvw503ee/AAAiaGb3TwhMrZMJb2j-rd36a?dl=0

2 个答案:

答案 0 :(得分:6)

在示例中的Button_Clicked()功能中,在DetailPage页面中,在调用PushModalAsync(new TeachPage());后调用模态,请使用:

NavigationPage.SetHasNavigationBar(this, false);
NavigationPage.SetHasBackButton(this, false);

我的猜测是当你尝试使用上面的SetHasBackButton时,你是在Modal本身上做的,但你实际看到的后退按钮来自你的DetailPage。

添加后,弹出模式,后退按钮消失。如果您在模态上设置“后退”按钮以关闭它,您可以通过在DetailPage代码隐藏中添加OnAppearing()函数,轻松地将您的NavBar和BackButton返回到DetailPage中:

protected override void OnAppearing()
{
    base.OnAppearing(); // do the usual stuff OnAppearing does
    NavigationPage.SetHasNavigationBar(this, true); //get your navbar back
    NavigationPage.SetHasBackButton(this, true); //get your back button back
}

答案 1 :(得分:0)

因此,以Jaken Herman的解决方案为例,我创建了一个名为ModalPushPage的新页面,如下所示:

public class ModalPushPage : ContentPage
{
    protected override void OnDisappearing()
    {
        base.OnDisappearing();
        NavigationPage.SetHasNavigationBar(this, false);
        NavigationPage.SetHasBackButton(this, false);
    }
    protected override void OnAppearing()
    {
        base.OnAppearing();
        NavigationPage.SetHasNavigationBar(this, true);
        NavigationPage.SetHasBackButton(this, true);
    }
}

从您想要推送模态页面的页面中的此自定义页面扩展,将自动处理后退按钮。

在这种情况下,如果您决定在派生类中覆盖其中一个或两个方法,则仍需要调用base.OnAppearing();base.OnDisappearing();

你当然也可以在onAppearing& amp;上添加代码。 onDisappearing方法在您自己的页面中,而不是为它创建一个单独的自定义页面。