1
votes

Basculer par programme entre les onglets dans une TabbedPage

J'ai une page à onglets avec 4 enfants (4 onglets), et je veux remplacer le bouton de retour pour toujours définir la première page lorsque vous appuyez dessus. J'ai essayé plusieurs façons, cela me semble le plus logique, mais cela ne fonctionne pas - tabbedPage est toujours nul (lorsque je remplace dans tous les onglets)

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

J'ai essayé de remplacer cela bouton retour dans TabbedPage Parent comme ceci:

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

mais il ferme toujours mon application. Une idée de la raison pour laquelle cette tabbedPage est nulle pour moi?


3 commentaires

C'est probablement parce que this.Parent ne peut pas être converti en TabbedPage . Lorsque vous utilisez comme , une conversion échouée renvoie null plutôt que de lancer une exception. Déboguez-le et voyez ce qu'est réellement this.Parent .


Oui, bien sûr, je ne peux pas diffuser en tant que TabbedPage . Je dois faire 'this.Parent.Parent et il diffuse comme il se doit. Le problème était que mes enfants sont NavigationPage, et c'est pourquoi je ne peux pas le caster. Merci!


Ça marche maintenant? Vous pouvez vérifier ma réponse.


3 Réponses :


1
votes

Premièrement, lorsque vous avez TabbedPage, OnBackButtonPressed est appelé non pas dans ContentPage, mais à la place sur TabbedPage lui-même. Donc, le bon endroit pour remplacer la méthode est en effet dans TabbedPage.

Deuxièmement, si vous remplacez la méthode dans TabbedPage lui-même, il fera le travail, comme ceci:

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

    CurrentPage = firstPage;
    return true;
}


1 commentaires

Il est également appelé dans ContentPage. Mon problème était que ma page enfants est NavigationPage et que je devrais utiliser «this.Parent.Parent» pour effectuer un cast. protected override bool OnBackButtonPressed () {var tabbedPage = this.Parent.Parent as TabbedPage; tabbedPage.CurrentPage = tabbedPage.Children [0]; retourne vrai; }



1
votes

Vous pouvez définir la TabbedPage actuelle dans App.xaml.cs lorsque vous définissez la MainPage de App.

dans App.xaml.cs

MainPage voici la TabbedPage dans votre projet.

protected override bool OnBackButtonPressed()
{

    App currentApp = Application.Current as App;
    var tabbedpage = currentApp.CurrentPage;

    tabbedpage.CurrentPage = tabbedpage.Children[0];

    return true;

}

Et maintenant vous pouvez y accéder dans la page enfant.

public partial class App : Application
{
    public MainPage CurrentPage { get; }
    public App()
    {
        InitializeComponent();

        MainPage tabbedPage = new MainPage();
        CurrentPage = tabbedPage;

        DependencyService.Register<MockDataStore>();
        MainPage = tabbedPage;
    }
    //...
}

Le code ci-dessus fonctionne bien dans mon projet. Si cela ne fonctionne toujours pas de votre côté, vous pouvez partager un échantillon afin que je puisse le tester.


2 commentaires

Oui, votre code fonctionnera bien dans une simple page à onglets, mais lorsque je poste cette question, je ne savais pas que ce problème est lié à mes enfants sont NavigationPage et pour tester votre code et tester votre code, je devrais beaucoup changer. Merci quand même


Vous pouvez partager votre réponse ou accepter la réponse si cela vous aide :)



1
votes

Mon problème était que ma page enfants était NavigationPage et que je devais utiliser this.Parent.Parent pour lancer le cast. Voici donc comment procéder lorsque vous utilisez NavigaionPage comme Enfants de TabbedPage

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


0 commentaires