【问题标题】:Programmatically switch between Tabs in a TabbedPage以编程方式在 TabbedPage 中的选项卡之间切换
【发布时间】:2020-05-12 16:20:30
【问题描述】:

我有 4 个子标签页(4 个标签页),我想覆盖后退按钮,以便在您按下它时始终设置第一页。我尝试了几种方法,这对我来说似乎最有意义,但它不起作用 - tabbedPage 始终为空(当我在所有选项卡中覆盖时)

protected override bool OnBackButtonPressed()
{
    var tabbedPage = this.Parent as TabbedPage;
    tabbedPage.CurrentPage = tabbedPage.Children[1];
    return base.OnBackButtonPressed();
}

我试图像这样覆盖 TabbedPage Parent 中的这个后退按钮:

protected override bool OnBackButtonPressed()
{
    if(CurrentPage == FirstPage)
    {
        return base.OnBackButtonPressed();
    }
    CurrentPage = FirstPage;
    return true;
}

但它总是关闭我的应用程序。知道为什么 tabbedPage 对我来说是空的吗?

【问题讨论】:

  • 可能是因为this.Parent 不能转换为TabbedPage。当使用 as 时,失败的转换返回 null 而不是抛出异常。调试它,看看this.Parent 到底是什么。
  • 是的,我当然不能转换为TabbedPage。我必须做'this.Parent.Parent,它正在铸造它应该如何。问题是我的孩子是 NavigationPage,这就是我不能投射它的原因。谢谢!
  • 现在可以用了吗?你可以检查我的答案。

标签: c# xamarin xamarin.forms


【解决方案1】:

我的问题是我的子页面是NavigationPage,我应该使用this.Parent.Parent 进行投射。所以当你使用NavigaionPage 作为ChildrenTabbedPage 时应该这样做

protected override bool OnBackButtonPressed()
{
    var tabbedPage = this.Parent.Parent as TabbedPage;
    tabbedPage.CurrentPage = tabbedPage.Children[0];
    return true;
}

【讨论】:

    【解决方案2】:

    首先,当您拥有 TabbedPage 时,OnBackButtonPressed 不是在 ContentPage 中被调用,而是在 TabbedPage 本身上被调用。因此,重写该方法的正确位置确实在 TabbedPage 中。

    其次,如果您在 TabbedPage 本身中重写该方法,它将完成工作,如下所示:

    protected override bool OnBackButtonPressed()
    {
        var firstPage = Children[0];
        if (CurrentPage == firstPage)
        {
            return base.OnBackButtonPressed();
        }
    
        CurrentPage = firstPage;
        return true;
    }
    

    注意:请注意您的 Children 集合是什么。如果您将页面包装在 NavigationPage 中,则检查将不正确。

    【讨论】:

    • 它也在 ContentPage 中被调用。我的问题是我的子页面是 NavigationPage,我应该使用 'this.Parent.Parent' 进行投射。 protected override bool OnBackButtonPressed() { var tabbedPage = this.Parent.Parent as TabbedPage; tabbedPage.CurrentPage = tabbedPage.Children[0]; return true; }
    【解决方案3】:

    设置App的MainPage时,可以在App.xaml.cs中设置当前TabbedPage。

    在 App.xaml.cs 中

    这里的MainPage是你项目中的TabbedPage。

    public partial class App : Application
    {
        public MainPage CurrentPage { get; }
        public App()
        {
            InitializeComponent();
    
            MainPage tabbedPage = new MainPage();
            CurrentPage = tabbedPage;
    
            DependencyService.Register<MockDataStore>();
            MainPage = tabbedPage;
        }
        //...
    }
    

    现在您可以在子页面中访问它了。

    protected override bool OnBackButtonPressed()
    {
    
        App currentApp = Application.Current as App;
        var tabbedpage = currentApp.CurrentPage;
    
        tabbedpage.CurrentPage = tabbedpage.Children[0];
    
        return true;
    
    }
    

    上面的代码在我的项目中运行良好。如果它仍然对您不起作用,您可以分享一个示例,以便我进行测试。

    【讨论】:

    • 是的,您的代码在简单的标签页中可以正常工作,但是当我发布这个问题时,我不知道这个问题与我的孩子有关 NavigationPage 并测试您的代码并测试您的代码我会必须改变很多。还是谢谢
    • 如果对您有帮助,您可以分享您的答案或接受答案:)
    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    相关资源
    最近更新 更多