43 votes

Comment gérer le bouton retour sur Windows Phone 7

Sur l'émulateur Windows phone 7, lorsque le bouton de retour matériel est pressé, le comportement par défaut est de fermer l'application en cours. Je veux remplacer ce comportement par défaut afin de naviguer vers la page précédente de mon application.

Après quelques recherches, il semble qu'il soit possible de le faire en surchargeant la méthode OnBackKeyPress, comme suit :

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
    // do some stuff ...

    // cancel the navigation
    e.Cancel = true;
}

Cependant, en cliquant sur le bouton "retour", je ferme toujours mon application. En plaçant un point d'arrêt sur la méthode ci-dessus, on constate qu'elle n'est jamais appelée. J'ai un autre point d'arrêt sur le code de sortie de mon application, et ce point d'arrêt es hit.

Y a-t-il quelque chose d'autre que je doive faire pour intercepter le bouton retour ?

29voto

David_001 Points 2825

Il semblerait qu'il ne soit pas possible de remplacer la méthode OnBackKeyPress pour intercepter la touche retour, à moins d'utiliser l'attribut Navigate pour passer d'une page à l'autre dans votre application.

Ma méthode de navigation précédente consistait à modifier le visuel de la racine, par exemple :

App.Current.RootVisual = new MyPage(); 

Cela signifie que je pouvais garder toutes mes pages en mémoire et que je n'avais pas besoin de mettre en cache les données stockées sur celles-ci (certaines de ces données sont collectées sur le net).

Il semble maintenant que je doive utiliser la méthode Navigate sur le cadre de la page, 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 pourrais alors remplacer la gestion du bouton retour de la manière décrite dans ma question...

23voto

ManicBlowfish Points 907

Si vous ne voulez pas du comportement par défaut de la touche retour, définissez Cancel = true dans le paramètre CancelEventArgs de OnBackKeyPress. Dans ma page, j'ai remplacé la touche retour 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;
        }
    }

3voto

Stonetip Points 514

J'ai pu utiliser cette technique pour faire ce que je voulais, c'est-à-dire empêcher la navigation arrière tout en masquant un contrôle qui entre et sort de la fenêtre. Par défaut, la visibilité du contrôle est réduite. Les Storyboards sont utilisés pour contrôler quand il devient visible ou réduit. Dans XAML, à l'intérieur du Storyboard :

<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ControlScroller" Storyboard.TargetProperty="(UIElement.Visibility)">
<ObjectAnimationUsingKeyFrames.KeyFrames>
    <DiscreteObjectKeyFrame KeyTime="00:00:00">
        <DiscreteObjectKeyFrame.Value>
            <Visibility>Visible</Visibility>
        </DiscreteObjectKeyFrame.Value>
    </DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames.KeyFrames>

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 cache le ContentScroller (qui est une grille), le KeyTime est défini sur "00:00:01" car je veux qu'il reste visible pendant qu'il glisse (et s'estompe) hors de vue.

Note 2 : La raison StoryboardHideControlSlider.GetCurrentState() != ClockState.Active est inclus dans l'instruction if parce 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 empêche le bouton retour d'annuler 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 masquer et qu'il a l'intention de retourner à la page précédente. (Au moins, c'est le comportement qu'il obtiendra... et il ne verra pas l'animation deux fois) !

0voto

Résoudre la navigation circulaire dans les applications Windows Phone Silverlight a été mis en œuvre en tenant compte de ce problème.

Vous pouvez également revenir en arrière et rafraîchir votre page principale plutôt que de naviguer vers une nouvelle instance de votre page principale si vous trouvez cela plus naturel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X