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 Réponses :
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; }
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; }
Vous pouvez définir la TabbedPage actuelle dans App.xaml.cs lorsque vous définissez la MainPage de App.
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.
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 :)
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; }
C'est probablement parce que
this.Parent
ne peut pas être converti enTabbedPage
. Lorsque vous utilisezcomme
, une conversion échouée renvoienull
plutôt que de lancer une exception. Déboguez-le et voyez ce qu'est réellementthis.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.