2016-04-14 5 views
3

Ich habe UWP App mit Prism und AppShell. Ich möchte Bestätigung Dialog vor dem Beenden von BackButton hinzufügen. Ich versuchte dies:Wie behandelt HardwareButtons.BackPressed in UWP?

protected override Task OnLaunchApplicationAsync(LaunchActivatedEventArgs args) 
    { 
     ... 
     SystemNavigationManager.GetForCurrentView().BackRequested += App_BackRequested; 

     ... 
    } 

private void App_BackRequested(object sender, BackRequestedEventArgs e) 
    { 
     Frame rootFrame = Window.Current.Content as Frame; 
     if (rootFrame == null) 
     { 
      return; 
     } 

     if (rootFrame.CanGoBack && e.Handled == false) 
     { 
      <add confirm dialog here> 
      e.Handled = true; 
     } 
    } 

Aber rootFrame ist immer null und wenn die Geschichte Stack leer und ich drückte Backbutton App nahe ist, selbst wenn imake dies:

private void App_BackRequested(object sender, BackRequestedEventArgs e) 
{ 
     e.Handled = true; 
} 

Auch habe ich versucht,

HardwareButtons.BackPressed += App_BackRequested; 

und es hilft auch nicht.

Antwort

1

versuchen, diese unter Linien OnLaunchApplicationAsync Methode hinzufügen

protected override Task OnLaunchApplicationAsync(LaunchActivatedEventArgs args) 
    { 
     //...... 
     DeviceGestureService.GoBackRequested += (s, e) => 
     { 
      e.Handled = true; 
      e.Cancel = true; 
      if (NavigationService.CanGoBack()) 
      { 
       NavigationService.GoBack(); 
      } 
      else 
      { 
       // PUT YOUR LOGIC HERE (Confirmation dialog before exit) 
       Application.Current.Exit(); 
      } 
     }; 
     //...... 
    } 
+0

+1. Wenn Sie erklären, was Sie dadurch erreichen, ist es für die PO leichter zu verstehen, wie Sie das Problem angehen. –

+0

mit Prism gibt die Möglichkeit, Hardware Buttons Ereignisse wie (CameraButtonReleased, CameraButtonPressed, CameraButtonHalfPressed, GoBackRequested, .....) nur in OnLaunchApplicationAsync-Methode zu implementieren –

2

Code in App.xaml.cs hinzufügen -

private async void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e) 
    { 

     e.Handled = true; 
     Frame rootFrame = Window.Current.Content as Frame; 
     if (rootFrame.CanGoBack && rootFrame != null) 
     { 

      rootFrame.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(); 
      } 
     } 
    } 

Fügen Sie diese Zeile in Konstruktor App.xaml.cs -

HardwareButtons.BackPressed += HardwareButtons_BackPressed; 
+0

Es funktioniert auf neue leere Projekt, aber nicht in meiner App arbeiten. rootFrame immer null und wenn ich NO auf Popup-App trotzdem geschlossen drücken. Ich denke, es ist, weil ich dieses: protected override UIElement CreateShell (Frame rootFrame) { var shell = Container.Resolve (); shell.SetContentFrame (rootFrame); Rückschale; } –