Comment gérer le bouton Retour sur Windows Phone 7

Sur l’émulateur Windows Phone 7, lorsque vous appuyez sur le bouton Retour au matériel, le comportement par défaut consiste à fermer votre application actuelle. Je souhaite remplacer ce comportement par défaut pour qu’il accède à la page précédente de mon application.

Après quelques recherches, il semble que cela soit possible en remplaçant la méthode OnBackKeyPress, comme ceci:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) { // do some stuff ... // cancel the navigation e.Cancel = true; } 

Cependant, cliquer sur le bouton Retour ferme toujours mon application. Mettre un point d’arrêt sur la méthode ci-dessus révèle qu’il n’est jamais appelé. J’ai un autre point d’arrêt sur mon code de sortie d’application, et ce point d’arrêt est atteint.

Y a-t-il autre chose que je dois faire pour intercepter le bouton de retour?

Il semblerait qu’il ne soit pas possible de remplacer la méthode OnBackKeyPress pour intercepter la clé de retour, sauf si vous utilisez la méthode Navigate pour vous déplacer entre les pages de votre application.

Ma méthode de navigation précédente consistait à changer le visuel racine, comme:

 App.Current.RootVisual = new MyPage(); 

Cela signifiait que je pouvais garder toutes mes pages en mémoire, donc je n’avais pas besoin de mettre en cache les données stockées sur elles (certaines des données sont collectées sur le net).

Maintenant, il me semble que je dois utiliser la méthode Navigate sur le cadre de la page, ce qui crée une nouvelle instance de la page vers laquelle je navigue.

 (App.Current.RootVisual as PhoneApplicationFrame).Navigate( new Uri("/MyPage.xaml", UriKind.Relative)); 

Une fois que j’ai commencé à naviguer en utilisant cette méthode, je pouvais alors remplacer la gestion du bouton arrière de la manière décrite dans ma question …

Si vous ne voulez pas le comportement de la clé de retour par défaut, définissez Cancel = true dans le paramètre CancelEventArgs dans OnBackKeyPress. Dans ma page, j’ai remplacé le bouton Précédent pour fermer un contrôle de navigateur Web au lieu de revenir en arrière.

  protected override void OnBackKeyPress(CancelEventArgs e) { if (Browser.Visibility == Visibility.Visible) { Browser.Visibility = Visibility.Collapsed; e.Cancel = true; } } 

J’ai été capable d’utiliser cette technique pour faire ce que je voulais, à savoir empêcher la navigation arrière tout en cachant un contrôle qui glisse dans et hors de la fenêtre. Par défaut, la visibilité du contrôle est réduite. Les storyboards sont utilisés pour contrôler le moment où il devient visible ou réduit. En XAML, dans le Storyboard:

     Visible    

Puis dans le code de la page:

 protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) { if(ControlScroller.Visibility == Visibility.Visible && StoryboardHideControlSlider.GetCurrentState() != ClockState.Active) { StoryboardHideControlSlider.Begin(); ContentGrid.IsHitTestVisible = true; e.Cancel = true; } } 

Remarque: dans le Storyboard qui masque ContentScroller (qui est une grid), le paramètre KeyTime est défini sur “00:00:01” car je souhaite qu’il rest visible lorsqu’il est en train de glisser (et de disparaître) hors de vue.

Remarque 2: La raison pour laquelle StoryboardHideControlSlider.GetCurrentState() != ClockState.Active est inclus dans l’instruction if est que si l’utilisateur appuie deux fois sur le bouton Retour et que le Storyboard n’est pas terminé, il s’exécutera à nouveau. Cela évite que le bouton retour annule la navigation vers la page précédente. En d’autres termes, si le Storyboard est actif, le code “sait” que l’utilisateur a déjà commencé à le cacher et qu’il souhaite revenir à la page précédente. (Bon, au moins, c’est le comportement qu’ils vont avoir … et ils ne verront pas l’animation deux fois)!