Xamarin Forms中的Strange NavigationBar行为

时间:2016-07-13 12:41:43

标签: xamarin xamarin.android xamarin.forms navigationbar

我有一个登录页面,它是我的应用程序的起点。此页面的导航栏隐藏有以下代码:

 NavigationPage.SetHasNavigationBar(this, false);

从登录页面我使用以下代码启动仪表板页面:

Navigation.PushAsync(new Dashboard());

我在登录页面的两个单独位置执行此操作。第一个位置是登录页面的内部构造函数,我检查活动用户会话,第二个位置是处理按钮点击登录的内部方法。

所以我这样打电话给Navigation.PushAsync()

第一种方式:

public Login()
{
    NavigationPage.SetHasNavigationBar(this, false);
    InitializeComponent();
    var loginSession = App.DataService.CheckUserSession();
    if(loginSession != null)
    {
        Navigation.PushAsync(new Dashboard());
    }
}
第二种方式:

public void OnLogin(object o, EventArgs e)
{
    Navigation.PushAsync(new Dashboard());
}

这就是事情开始变得奇怪的地方。如果我点击按钮打开我的Dasboard页面(使用第二个例子),Dasboard页面会正常加载并拥有它自己的NavigationBar。但是,每当我找到用户会话时打开Dasboard页面(使用第一种方式),我的Dasboard页面将缺少NavigationBar。更糟糕的是,如果我从Dasboard页面导航到另一个页面(比如说设置),然后返回到Dasboard,导航栏将在Dasboard页面上正常工作。我尝试删除隐藏登录页面NavigationPage.SetHasNavigationBar(this, false);上的导航栏的代码 这样做的是登录页面会显示它的导航栏,但在导航到仪表板时(使用第一种方式),导航栏将保持与登录页面相同。

我可能想知道问题是否在于我的所有页面(登录,仪表板和设置)都是ContentPage的孩子并且必须从NavigationPage继承?

此时我对NavigationBar发生的事情感到非常困惑。

1 个答案:

答案 0 :(得分:2)

这是因为正在从Login构造函数中推送Dashboard页面。相反,覆盖OnAppearing()并在那里执行:

protected override async void OnAppearing()
{
    base.OnAppearing();

    await Navigation.PushAsync(new Dashboard());
}

此外,您的子页面应该从ContentPage继承,因为嵌套NavigationPages可能会导致其他问题:)