【问题标题】:How to change Navigationbar title irrespective of Tab title无论选项卡标题如何,如何更改导航栏标题
【发布时间】:2018-05-30 05:54:09
【问题描述】:

我将导航栏上的页面标题设置为

public Homework ()
{
   InitializeComponent ();
   Title = "Homework";     
}

此页面是选项卡页面的子页面,其中选项卡已经有标题“Tab1”。

现在,当我从 Tab1 打开 Homework.cs 页面时,上面的代码将 Tab 标题更改为 Homework,Navigationbar 标题也更改为“Homework”。我不想更改 Tab 标题。

MyTabbed 页面代码使用

   public class MyTabbedPage : TabbedPage
    {
        public MyTabbedPage()
        {
           this.CurrentPageChanged +=delegate
           {        
             this.Title = this.CurrentPage.Title;
           };     
        }
    }

看一些方便的sn-ps

public App ()
{
    InitializeComponent();
    MainPage = new NavigationPage(new LoginPage());          
}

LoginContentPage 按钮点击

btnLogin.Clicked +=async delegate {
 await Navigation.PushAsync(new ParentDashboard(), false);
};

包含选项卡的父仪表板

public partial class ParentDashboard : MyTabbedPage
{
    public ParentDashboard()
    {
        InitializeComponent();      
        Title="Home"; //upto here title working
    }
}

从现在开始,我点击 HomewPage,正如我在这个问题的开头显示的那样,这不起作用。 我该怎么做?

【问题讨论】:

    标签: c# xamarin.forms xamarin.ios


    【解决方案1】:

    我猜你项目的层次结构可能是这样的:

    NavigationPage => TabbedPage => 子页面。

    那么每次子页面的标题改变时,TabbedPage 的标题也会改变。即使我们为这个子页面制作了一个自定义渲染器,也很难更改页面的导航栏标题。因为 NavigationCtroller 的根 viewController 就是你的标签页。

    我建议您调整项目的层次结构,使每个子页面都由导航页面包裹,例如:

    这样,您可以通过设置Homework的标题来设置导航页的标题来调整标签项的标题和改变导航栏的标题。

    关于构造app()可以参考我的代码:

    // This is a TabbedPage
    var tabbedPage = new MyTabbedPage();
    
    var firstPage = new MainPage();
    // The NavigationPage's Title will be shown on the tab, and firstPage's title can be shown on the navigation bar
    tabbedPage.Children.Add(new NavigationPage(firstPage) { Title = "FirstPage" });
    
    var homePage = new Homework();
    tabbedPage.Children.Add(new NavigationPage(homePage) { Title = "SecondPage" });
    
    MainPage = tabbedPage;
    

    【讨论】:

    • 您使用的是哪个层次结构?我的建议是否解决了您的问题?
    • 你可以测试一下。我尝试使用自定义渲染器解决您的问题,但正如我在上面所说的导航控制器的根控制器是您的标签栏控制器。很难改变,通常我们使用截图中的方式创建具有层次结构的项目。
    • 哦,你真好。但是我该如何开始修改。看看我更新的问题
    • 嗨,我还在处理它,遇到其他问题,导航栏上没有显示返回按钮。现在我正在考虑对此进行另一个线程。首先我有登录页面显示如何使用标签页启动应用程序
    • 如果我们上面谈到的这个问题已经解决了,您可以标记这个以帮助其他社区了解这个问题。然后我们可以在您的新帖子中讨论其他问题。
    【解决方案2】:

    回答这个问题已经很晚了,但我花了一些时间来解决这个问题,并希望与有相同目标的任何人分享我的解决方案:

    • 点击选项卡时,将 TabbedPage 的标题设置为子页面标题(例如“完整标题”)
    • 使用短于孩子整页标题的标签(例如“标题”)
    • 避免使用其他层或导航堆栈(Land Lu 建议 - MSFT 的回答)

    解决方案

    在我的内容页面的基类中,我添加了 LongTitle 属性。这使得页面的标题可以更长和更短(=默认)。

    假设 childPage1 的标签标签应该比其原始标题短。所以我将其 Title 属性更改为较短的版本(“Title”)并将 LongTitle 属性设置为较长的​​版本(“Full title”)

    我在 TabbedPage 的构造函数中将该页面与另一个子页面一起添加到 TabbedPage:

    Children.Add(childPage1);
    Children.Add(childPage2);
    

    标签标签绑定到它们的 Title 属性,这是较短的一个,即。 e.在 childPage1 的情况下为“标题”。这符合预期。

    当点击标签时,会触发 CurrentPageChanged 事件。我使用它来更新 TabbedPage 的标题并将其设置为 LongTitle(如果它存在于子页面)。

    CurrentPageChanged += (s, e) => Title = (CurrentPage as BasePage).LongTitle ?? CurrentPage.Title;
    

    BasePage 应替换为适合您页面的基类。

    【讨论】:

      猜你喜欢
      • 2018-07-19
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      相关资源
      最近更新 更多