[WP7] NavigationService.RemoveBackEntry
Parmi toutes les nouveautés, Mango apporte une nouvelle fonction bien sympathique pour palier à certains problèmes de navigation.
Prenons un exemple simple : une application avec deux pages. Lorsque l’utilisateur clique sur un bouton de la première page, il est amené sur la seconde pour saisir des informations. En validant les informations, il est ramené à la première page.
La manière la plus “immédiate” d’implémenter ce scénario est de placer sur le bouton de la première page :
1: private void button1_Click(object sender, RoutedEventArgs e)
2: {
3: this.NavigationService.Navigate(new Uri("/Page2.xaml", UriKind.Relative));
4: }
Et sur le bouton de la seconde page :
1: private void button1_Click(object sender, RoutedEventArgs e)
2: {
3: this.NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.Relative));
4: }
En testant, cela semble marcher : on navigue bien de la première page à la seconde, puis de la seconde à la première. Problème cependant, après cet enchainement, l’historique de navigation est le suivant :
Page 1 –> Page 2 –> Page 1
Conséquence : si à partir de là on appuie sur le bouton back du téléphone, on est ramené à la seconde page, puis à nouveau la première, pour enfin quitter l’application ! Peu commode pour l’utilisateur.
Dans ce cas-ci, la solution est simple, il suffit de remplacer l’appel à “Navigate” dans la seconde page par “GoBack” :
1: private void button1_Click(object sender, RoutedEventArgs e)
2: {
3: this.NavigationService.GoBack();
4: }
Maintenant, en appuyant sur le bouton de la seconde page, on est ramené en arrière dans l’historique de navigation. On atterit donc bien sur la première page, et un nouvel appui sur le bouton back fermera l’application.
Tout cela est bien joli, mais que se passe t’il si on a trois pages ? Le bouton de la première page renvoie à la seconde page pour que l’utilisateur saisisse des informations, le bouton de la seconde page renvoie sur une troisième pour saisir encore d’autres informations, et enfin le bouton de la troisième valide et ramène à la première page.
En utilisant la fonction Navigate, même problème, l’historique de navigation sera :
Page 1 –> Page 2 –> Page 3 –> Page 1
Et cette fois-ci, nous ne pouvons pas utiliser la fonction GoBack depuis la troisième page, car cela nous ramenerait sur la seconde page alors que l’on veut retourner à la première ! Jusqu’à présent, un des seuls moyens pour se sortir de cette situation était de détecter dans la seconde page le cas où l’on revient de la troisième page, et d’appeler à nouveau GoBack pour renvoyer l’utilisateur sur la première page. Cela fonctionne, mais c’est peu élégant.
C’est ici que Mango entre en scène, avec la fonction NavigationService.RemoveBackEntry. Celle-ci va supprimer la dernière entrée de l’historique de navigation. A partir de là, il est possible d’appeler Navigate depuis la troisième page pour revenir sur la première page, et dans la première page de nettoyer l’historique de navigation dans l’évènement OnNavigatedTo :
1: protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
2: {
3: base.OnNavigatedTo(e);
4:
5: while (this.NavigationService.BackStack.Any())
6: {
7: this.NavigationService.RemoveBackEntry();
8: }
9: }
10:
Du coup, en revenant sur la première page, l’historique de navigation est bien vidé. Un appui sur le bouton back du téléphone quittera alors l’application, comme l’utilisateur s’y attend.
Problème réglé !
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :