26

Mam 2 strony w mojej aplikacji Windows Phone 8.1 Universal.Windows Phone 8.1 Universal App kończy się po powrocie z drugiej strony?

poruszać z Strona1 .xaml do STR.2 .xaml za pomocą przycisku z kodem zdarzenia kliknięcia:

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

Kiedy jestem na stronie 2, i użyć przycisku sprzętowego powrotem aplikację zamyka się bez wyjątku lub czegokolwiek. Po prostu wraca do ekranu startowego.

Próbowałem już następujące na 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(); 
    } 

O ile wiem, nie wyczyścić stos powrotem.

Co się dzieje i jak mogę to naprawić?

poważaniem, Niels

Odpowiedz

79

To jest nowy Windows Phone 8.1.

Jeśli utworzysz nową aplikację Universal Hub za pomocą szablonu VS2013, zauważysz klasę we wspólnym folderze o nazwie NavigationHelper.

Ten NavigationHelper daje wskazówkę, jak prawidłowo reagować na naciśnięcie przycisku Wstecz. Tak więc, jeśli nie chcesz używać NavigationHelper, oto jak uzyskać starego zachowania powrotem:

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

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

Można też zrobić to na poziomie aplikacji, aby uniknąć konieczności zrobić na każdej stronie:

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 
+1

Klasa HardwareButtons nie jest dostępna w aplikacjach Universal [link] (http://msdn.microsoft.com/en-us/library/windowsphone/develop/windows.phone.ui.input.hardwarebuttons.backpressed.aspx) – Nanoc

+2

@Nocet sprawdź ponownie. –

+0

Przepraszam za nieporozumienie. – Nanoc

5

Jeśli chcesz wyświetlić okno dialogowe potwierdzenia po naciśnięciu przycisku wstecz zanotuj poniższy kod

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(); 
      } 
     } 
    } 
+0

Próbowałem powyższego kodu, ale okno dialogowe wiadomości nie jest wyświetlane. Zamiast czekać na metodę ShowAsync(), przechodzi do następującego "jeśli". jakieś pomysły? (Jestem nowy w Windows Phone i programowaniu asynchronicznym). – Leonardo

1

można użyć „wzór” NavigationHelper czarownica pomaga również do obsługi zdarzeń lifecyle.

NavigationHelper to klasa dostarczana przez Microsoft (nie jest częścią interfejsu API Windows Phone), w której można zarejestrować swoje strony, a NavigationHelper dba o FrameHistory.

Aby korzystać z NavigationHelper, musisz dodać klasę do swojego projektu i zarejestrować strony w urządzeniu NavigationHelper po załadowaniu. Po dodaniu do projektu BasicPage (a nie BlankPage) VisualStudio dodaje folder o nazwie common z niektórymi klasami pomocniczymi, w tym klasą NavigationHelper.

Aby zarejestrować swoje strony w urządzeniu NavigationHelper, należy dodać następujący kod do wszystkich stron, do których ma nastąpić nawigacja.

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); 
    } 
} 

Aby uzyskać więcej informacji na ten temat i zdolność do obsługi zdarzeń cyklu życia można przeczytać ten article lub obejrzyj video.