web-dev-qa-db-fra.com

L'application universelle Windows Phone 8.1 se termine lorsque vous revenez de la deuxième page?

J'ai 2 pages dans mon application universelle Windows Phone 8.1.

Je navigue de Page1. Xaml à Page2. Xaml en utilisant un bouton avec le code d'événement de clic:

this.Frame.Navigate(typeof(Page2));

Lorsque je suis sur la page 2 et que j'utilise le bouton de retour matériel, l'application se ferme sans exception ni quoi que ce soit. Il revient simplement à l'écran de démarrage.

J'ai déjà essayé ce qui suit sur Page 2:

public Page2()
    {
        this.InitializeComponent();
        Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    }

    void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)
    {
        Frame.GoBack();
    }

Pour autant que je sache, je n'efface pas la pile arrière.

Que se passe-t-il et comment puis-je résoudre ce problème?

Cordialement, Niels

26
Niels

Ceci est nouveau pour Windows Phone 8.1.

Si vous créez une nouvelle application universelle Hub à l'aide d'un modèle VS2013, vous remarquerez une classe dans le dossier Commun appelée NavigationHelper.

Ce NavigationHelper vous donne un indice sur la façon de réagir correctement à la pression du bouton Retour. Donc, si vous ne souhaitez pas utiliser NavigationHelper, voici comment récupérer l'ancien comportement:

public BlankPage1()
{
    this.InitializeComponent();
    HardwareButtons.BackPressed += HardwareButtons_BackPressed;
}

void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
    if (Frame.CanGoBack)
    {
        e.Handled = true;
        Frame.GoBack();
    }
}

Vous pouvez également le faire au niveau de l'application, pour éviter d'avoir à le faire sur chaque page:

public App()
{
    this.InitializeComponent();
    this.Suspending += this.OnSuspending;

    #if WINDOWS_PHONE_APP
    HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    #endif
}

#if WINDOWS_PHONE_APP
void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;

    if (rootFrame != null && rootFrame.CanGoBack)
    {
        e.Handled = true;
        rootFrame.GoBack();
    }
}
#endif
79
Igor Ralic

Si vous souhaitez afficher une boîte de dialogue de confirmation lorsque vous appuyez sur le bouton de retour Notez le code ci-dessous

    private async void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
    {
        e.Handled = true;
        if (Frame.CanGoBack)
        {
            Frame.GoBack();
        }
        else
        {
            var msg = new MessageDialog("Confirm Close");
            var okBtn = new UICommand("OK");
            var cancelBtn = new UICommand("Cancel");
            msg.Commands.Add(okBtn);
            msg.Commands.Add(cancelBtn);
            IUICommand result = await msg.ShowAsync();

            if (result != null && result.Label == "OK")
            {
                Application.Current.Exit();
            }
        }
    }
5
Munchan Park

Vous pouvez utiliser le navigateur "Pattern" de NavigationHelper qui vous aide également à gérer les événements de style de vie.

Le NavigationHelper est une classe fournie par Microsoft (il ne fait pas partie de l'API Windows Phone) où vous pouvez enregistrer vos pages et le NavigationHelper prend soin de FrameHistory.

Pour utiliser le NavigationHelper, vous devez ajouter la classe à votre projet et enregistrer les pages sur le NavigationHelper lorsqu'elles sont chargées. Lorsque vous ajoutez une BasicPage (pas une BlankPage) à votre projet, VisualStudio ajoute un dossier appelé commun avec certaines classes d'assistance, notamment la classe NavigationHelper.

Pour enregistrer vos pages dans NavigationHelper, vous devez ajouter le code suivant à toutes vos pages où vous voulez sur NavigationHelper.

public sealed partial class MySuperCoolPage : Page {
    private readonly NavigationHelper navigationHelper;

    public MySuperCoolPage() {
        InitializeComponent();
        navigationHelper = new NavigationHelper(this);
    }

    protected override void OnNavigatedFrom(NavigationEventArgs e){
        this.navigationHelper.OnNavigatedFrom(e);
    }

    protected override void OnNavigatedTo(NavigationEventArgs e) {
        navigationHelper.OnNavigatedTo(e);
    }
}

Pour plus d'informations sur ce sujet et la capacité de gérer les événements du cycle de vie, vous pouvez lire ceci article ou regarder ceci vidéo .

1
szuuuken