You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms:从Tabbed Page跳转后如何保留标签栏?

解决Xamarin.Forms中TabbedPage跳转后标签栏隐藏的问题

你遇到的这个问题在Xamarin.Forms开发里挺常见的——当直接在TabbedPage里调用Navigation.PushAsync时,新页面会被推到整个TabbedPage所在的导航栈顶部,自然就把原来的标签栏给覆盖隐藏了。要让新页面依然保留标签栏,核心思路是让跳转操作发生在当前标签页的独立导航栈中,而不是整个TabbedPage的全局导航栈。

下面给你两种可行的实现方案:


方案一:给每个Tab页嵌套NavigationPage(推荐)

把TabbedPage里的每个ContentPage都用NavigationPage包裹,这样每个标签页都拥有自己独立的导航栈,点击按钮跳转时,只会在当前标签的栈内添加新页面,标签栏会一直显示在底部。

修改后的XAML代码:

<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyTabbedpage" >
  <!-- 给Tab1包裹NavigationPage -->
  <NavigationPage Title="Tab1" Icon="Calender.png">
    <x:Arguments>
      <ContentPage x:Name="MySchedule">
        <StackLayout>
          <Button Clicked="Button_Clicked" Text="Test"></Button>
        </StackLayout>
      </ContentPage>
    </x:Arguments>
  </NavigationPage>

  <!-- Tab2同样包裹NavigationPage -->
  <NavigationPage Title="Tab2">
    <x:Arguments>
      <ContentPage x:Name="Submission">
        <StackLayout>
          <!-- 修正了你原代码里的语法错误:误写的</ListView>标签 -->
        </StackLayout>
      </ContentPage>
    </x:Arguments>
  </NavigationPage>

  <!-- Tab3也包裹NavigationPage -->
  <NavigationPage Title="Tab3">
    <x:Arguments>
      <ContentPage x:Name="Code">
      </ContentPage>
    </x:Arguments>
  </NavigationPage>
</TabbedPage>

C#代码无需修改:

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class MyTabbedpage: TabbedPage
{
    public MyTabbedpage()
    {
        InitializeComponent();
    }
    private void Button_Clicked(object sender, EventArgs e)
    {
        // 现在PushAsync是在当前Tab的NavigationPage栈中执行,标签栏会保留
        Navigation.PushAsync(new MyContentPage());
    }
}

方案二:直接获取当前Tab的导航上下文跳转

如果你不想给所有Tab都嵌套NavigationPage,也可以在按钮点击时,直接获取当前选中标签页的Navigation属性来执行跳转:

修改后的Button_Clicked方法:

private void Button_Clicked(object sender, EventArgs e)
{
    // 获取当前选中的标签页
    var currentTabPage = CurrentPage;
    // 使用当前页面的Navigation上下文跳转,新页面会留在当前Tab的栈内
    currentTabPage.Navigation.PushAsync(new MyContentPage());
}

不过这个方案有个小局限:如果当前Tab的页面没有被NavigationPage包裹,跳转后的页面顶部会没有返回按钮(因为没有导航栏),所以更推荐方案一的完整实现。


最后提醒下,你原XAML代码里Tab2部分有个语法错误:<StackLayout>后面误写了</ListView>标签,这会导致编译失败,我在方案一的代码里已经帮你修正了,记得留意这个细节~

内容的提问来源于stack exchange,提问作者Pritish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:39:57