web-dev-qa-db-fra.com

Comment gérer le bouton de retour sur Windows Phone 7

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

Après quelques recherches, il semble qu'il devrait être possible de le faire 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, en cliquant sur le bouton de retour, ma candidature est toujours fermée. Mettre un point d'arrêt sur la méthode ci-dessus révèle qu'elle n'est jamais appelée. J'ai un autre point d'arrêt sur mon code de sortie d'application, et ce point d'arrêt is hit.

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

43
David_001

Il semblerait qu'il ne soit pas possible de remplacer la méthode OnBackKeyPress pour intercepter la touche 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 qui y étaient stockées (certaines des données sont collectées sur le net).

Il semble maintenant que je doive réellement 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 de retour de la manière décrite dans ma question ...

29
David_001

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

J'ai pu utiliser cette technique pour faire ce que je voulais, c'est-à-dire empêcher la navigation en 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 quand il devient visible ou réduit. En 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'efface) hors de vue.

Remarque 2: La raison StoryboardHideControlSlider.GetCurrentState() != ClockState.Active est incluse dans l'instruction if parce que si l'utilisateur appuie deux fois sur le bouton Précédent 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. Autrement dit, si le Storyboard est actif, le code "sait" que l'utilisateur a déjà initié le cacher et a l'intention de revenir à la page précédente. (Eh bien, au moins c'est un comportement qu'ils vont obtenir ... et ils ne verront pas l'animation deux fois)!

3
Stonetip