Xamarin在导航返回后出现导航定位错误计数

Xamarin在导航返回后出现导航定位错误计数,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我正在使用以下方法设置当前页面的页码: protected override void OnAppearing() { base.OnAppearing(); // Page number _pageNumber = Navigation.NavigationStack.Count - 2; } 如果我向前导航并将新页面推到堆栈上,则一切正常: private async void btnContinue_Clicked(object sender, EventArgs

我正在使用以下方法设置当前页面的页码:

protected override void OnAppearing()
{
    base.OnAppearing();
    // Page number
    _pageNumber = Navigation.NavigationStack.Count - 2;
}
如果我向前导航并将新页面推到堆栈上,则一切正常:

private async void btnContinue_Clicked(object sender, EventArgs e)
{
    // Proceed to next view
    await Navigation.PushAsync(new MainPage());
}
但是,当我从一个页面返回时,似乎在弹出上一个页面之前调用了OnAppearing()方法。因此,
\u pageNumber
变量实际上是上一页的变量。我如何解决这个问题?我想把它放在构造函数中,但是NavigationStack.Count在那里总是返回0。
我的页面是动态编程的,因此,我无法将页码硬编码到页面中,因为调用了相同的页面,但值会根据页面的编号而变化。

这将是一种预期效果

调用PopAsync方法时,会发生以下事件:

  • 调用PopAsync的页面已调用其OnDisappearing覆盖
  • 正在返回到的页面已调用其覆盖
  • popsync任务返回
  • 因此,如果您想获得NavigationStack的当前计数,您可以对答案进行如下改进:

    在演示中,我使用MessageingCenter将当前的NavigationStack传递到最后一页。标签将显示当前的NavigationStack

    bool isFirstLoad = true;
    
    protected override void OnAppearing()
    {
        base.OnAppearing();
    
        if(isFirstLoad)
        {
          label.Text = Navigation.NavigationStack.Count.ToString();
          isFirstLoad = false;
        }
    
        MessagingCenter.Subscribe<Object,int>(this, "pop", (arg, num) => {
    
          label.Text = (num-1).ToString();
    
         });
    
    }
    
    bool isFirstLoad=true;
    出现时受保护的覆盖无效()
    {
    base.OnAppearing();
    if(isFirstLoad)
    {
    label.Text=Navigation.NavigationStack.Count.ToString();
    isFirstLoad=false;
    }
    订阅(这个“pop”,(arg,num)=>{
    label.Text=(num-1.ToString();
    });
    }
    
    当你打电话给爸爸

     private async void Button_Clicked_1(object sender, EventArgs e)
    {
       MessagingCenter.Send<Object,int>(this, "pop", Navigation.NavigationStack.Count);
       await Navigation.PopAsync();
    }
    
    private async void按钮\u单击\u 1(对象发送方,事件参数e)
    {
    MessagingCenter.Send(这个“pop”、Navigation.NavigationStack.Count);
    等待导航。PopAsync();
    }
    

    是的,应该这样!谢谢如果你喜欢我的问题,别忘了投赞成票;)