web-dev-qa-db-fra.com

Gestion de la navigation arrière Windows 10 (UWP)

Dans ma page Xaml, j'ai un cadre.

J'essaie d'avoir un événement backButton juste pour naviguer à l'intérieur du cadre.

alors j'ai essayé d'utiliser ce morceau de code

public MainPage(){
    this.InitializeComponent();
    if(Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons")) {
        Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    }
}
private void HardwareButtons_BackPressed(object sender,BackPressedEventArgs e) {
    if(insideFrame.CanGoBack())insideFrame.GoBack();
    else  Application.Current.Exit();
}

mais dans le téléphone après l'événement HardwareButtons_BackPressed, il ferme l'application.

Il semble y avoir un comportement par défaut du bouton Précédent sur MainPage ...

Comment puis-je le réparer? Et dans Windows 10, ajoute-t-il de nouveaux événements pour gérer la navigation arrière?


[Mettre à jour]

Maintenant, j'ai découvert qu'il était préférable d'utiliser SystemNavigationManager dans Windows 10 au lieu de Input.HardwareButtons.BackPressed.

SystemNavigationManager currentView = SystemNavigationManager.GetForCurrentView();
15
Shahriar

Vous devez indiquer au système que vous avez géré l'appui sur le bouton retour en définissant la propriété Handled de BackPressedEventArgs sur true.

  private void OnHardwareButtonsBackPressed(object sender, BackPressedEventArgs e)
  {
        // This is the missing line!
        e.Handled = true;

        // Close the App if you are on the startpage
        if (mMainFrame.CurrentSourcePageType == typeof(Startpage))
            App.Current.Exit();

        // Navigate back
        if (mMainFrame.CanGoBack)
        {
            mMainFrame.GoBack();
        }
  }
7
Tobias Hoefer

Windows 10 (UWP) inclut SystemNavigationManager in Windows.UI.Core namespace à des fins de navigation uniquement. 

Étant donné que SystemNavigationManager fait partie de Windows Universal Platform, il est donc pris en charge par toutes les familles de périphériques fonctionnant sous Windows 10, y compris Mobile et PC.

Pour une seule page


Si vous voulez juste gérer la navigation pour une seule page. Suivez les étapes suivantes

Étape 1. Utiliser l'espace de noms Windows.UI.Core 

using Windows.UI.Core;

Étape 2. Enregistre de nouveau l'événement de demande pour la vue actuelle. Le meilleur endroit pour cela est le constructeur principal de la classe après InitializeComponent().

public MainPage()
{
    this.InitializeComponent();
    //register back request event for current view
    SystemNavigationManager.GetForCurrentView().BackRequested += MainPage_BackRequested;
}

Étape 3. Gestion de l'événement BackRequested

private void Food_BackRequested(object sender, BackRequestedEventArgs e)
{
    if (Frame.CanGoBack)
    {
        Frame.GoBack();
        e.Handled = true;
    }
}

Pour une demande complète à un endroit pour un seul rootFrame


Le meilleur endroit pour manipuler tout le backbutton pour toutes les vues est App.xaml.cs

Étape 1. Utiliser l'espace de noms Windows.UI.Core 

using Windows.UI.Core;

Étape 2. Enregistre de nouveau l'événement de demande pour la vue actuelle. Le meilleur endroit pour cela est OnLaunched juste avant Window.Current.Activate

protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    ...
    SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;
    Window.Current.Activate();
}

Étape 3. Gestion de l'événement BackRequested

private void OnBackRequested(object sender, BackRequestedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame.CanGoBack)
    {
        rootFrame.GoBack();
        e.Handled = true;
    }
}

Références- Bouton arrière en UWP

J'espère que cela est utile à quelqu'un!

20
Vineet Choudhary

Suivez ces étapes:

  • Ajoutez deux variables globales à votre page comme ci-dessous.

    private NavigationHelper navigationHelper;
    private RelayCommand _GoBackCommand;
    
  • Ajoutez ensuite le code ci-dessous dans le constructeur de la page spécifique.

        // below code is to override the back navigation
        // hardware back button press event from navigationHelper
        _GoBackCommand = new RelayCommand
            (
                () => this.CheckGoBack(),
                () => this.CanCheckGoBack()
            );
    
        navigationHelper.GoBackCommand = _GoBackCommand;
        // ---------
    
  • Ajoutez ensuite les deux méthodes que nous venons de déclarer dans le constructeur.

    private bool CanCheckGoBack()
    {
        // this should be always true to make sure the app handles back buton manually.
        return true;
    }
    
    private void CheckGoBack()
    {
        // this will be execute when back button will be pressed
    }
    

ps. - Pour cela, vous devrez peut-être utiliser BasicPage au lieu de BlankPage lors de l'ajout d'une nouvelle page.

espérons que cela aidera ..!

0
Keval Langalia

Essayez ceci. Cela fonctionnera pour la navigation arrière.

  protected override void OnNavigatedTo(NavigationEventArgs e)
    {

      HardwareButtons.BackPressed += HardwareButtons_BackPressed;

    }


    void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
    {

    Frame rootFrame = Window.Current.Content as Frame;

        if (Frame.CanGoBack)
        {
            e.Handled = true;
            Frame.GoBack();
        }
    }

}
0
Husain Ahamed