none
WP8.1 Bouton Retour RRS feed

  • Question

  • Bonjour,

    Dans mon appli WP 8.1, le comportement du bouton retour est assez aléatoire...

    Au début, le bouton retour me ramenait à l'accueil du téléphone sans fermer l'appli (comportement comparable au bouton Windows), donc dans App.xaml.cs je redéfinis l’événement :

    void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)
    {
         Frame rootFrame = Window.Current.Content as Frame;
         if (rootFrame != null && rootFrame.CanGoBack)
         {
              rootFrame.GoBack();
              e.Handled = true;
          }
    }

    D'après moi cela devrait fonctionner de la même façon dans toute l'appli (sur toutes les pages). Mais ce n'est pas le cas, en réalité l'état de ma MainPage est "sauvegardé" : si je fais défiler le ScrollViewer dans ma MainPage, puis je clique sur un bouton qui m'amène à une autre page SecondPage, puis presse retour pour revenir à la MainPage, le ScrollViewer est dans le même état qu'avant (bon comportement). Cependant si je défile le ScrollViewer dans SecondPage, puis que je clique sur un bouton vers ThirdPage, puis que je fais retour pour aller dans SecondPage, le retour fonctionne (donc pour moi c'est la preuve que la définition dans App.xaml.cs fonctionne, car je rappelle qu'avant le bouton retour me ramenait à l'accueil) mais l'état du ScrollViewer n'a pas été sauvegardé et il est réinitialisé à sa position de départ.

    Une idée ?

    De plus, sur la MainPage, le bouton retour fait comme le bouton Windows : retour à l'accueil sans fermer l'appli. Pour cela j'ai une petite idée : rootFrame.CanGoBack vaut peut-être false si je suis sur la première page de l'application, dans ce cas je pourrais réaliser un traitement du genre :

    void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)
    {
         Frame rootFrame = Window.Current.Content as Frame;
         if (rootFrame != null && rootFrame.CanGoBack)
         {
              rootFrame.GoBack();
              e.Handled = true;
          }

          else { FERMER L'APPLI }

    }

    Est-ce un bon raisonnement ? Et si oui, que mettre dans mon else pour fermer l'appli ?

    Merci d'avance,

    Atanakar.

    vendredi 24 octobre 2014 13:48

Toutes les réponses

  • Bonjour,

    Personnellement, et je ne dis pas que c'est la meilleur façon, mais je fais met ce bout de code dans chacune des pages que je crée.

    private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
    {
        Frame frame = Window.Current.Content as Frame;
        if (frame == null)
        {
            return;
        }
    
        if (frame.CanGoBack)
        {
            frame.GoBack();
            e.Handled = true;
        }
    }

    En mettant dans le constructeur de la page, l'abonnement à l'évènement du BackPressed.

    // Event sur le bouton "Back"
    Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;

    J'ai aussi déclaré dans le constructeur de mon "MainPage" le NavigationCacheMode

    this.NavigationCacheMode = NavigationCacheMode.Required;

    Je ne sais pas si cela à une incidence réelle le fait de le mettre dans le "App.xaml" ou dans les pages.

    Ensuite, pour terminer l'application tu peux faire un :

    Application.Current.Terminate();
    
    Information sur le "Terminate".

    Voilà, en espérant t'aider un peu.
    lundi 27 octobre 2014 11:36
  • Je devrais tester cela dans les jours qui viennent, je marquerai alors ton message comme réponse :-)

    ça a déjà l'air très prometteur !

    Merci.

    mercredi 29 octobre 2014 12:50
  • Bonsoir,

    En effet il semblerait que rajouter 

    this.NavigationCacheMode = NavigationCacheMode.Required;

    dans toutes les pages dont je veux qu'elles soient sauvegardées en cache fonctionne.

    Cependant petit bémol pour : Application.Current.Terminate() car j'ai l'erreur :

    'Windows.Ul.Xaml.Application' ne contient pas une définition pour 'Terminate'

    Une idée ?
    • Modifié Atanakar vendredi 31 octobre 2014 10:35
    vendredi 31 octobre 2014 00:26