26

Tôi có 2 trang trong Windows Phone 8.1 Universal App.Windows Phone 8.1 Universal App chấm dứt khi điều hướng trở lại từ trang thứ hai?

tôi di chuyển từ Trang1 .xaml để Page2 .xaml bằng cách sử dụng một nút với mã sự kiện click:

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

Khi tôi đang trên Page2, và tôi sử dụng nút phần cứng trở lại ứng dụng đóng mà không có ngoại lệ hoặc bất cứ điều gì. Nó chỉ trở về màn hình bắt đầu.

Tôi đã thử các sau đây trên Trang 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(); 
    } 

Theo như tôi biết tôi không rõ ràng chồng trở lại.

Điều gì đang xảy ra và làm cách nào để khắc phục sự cố này?

Trân trọng! Niels

Trả lời

79

Đây là mới Windows Phone 8.1.

Nếu bạn tạo ứng dụng Hub Universal mới bằng mẫu VS2013, bạn sẽ thấy một lớp trong thư mục Chung được gọi là NavigationHelper.

Điều hướng nàyHelper cung cấp cho bạn gợi ý cách phản ứng đúng cách để nhấn nút quay lại. Vì vậy, nếu bạn không muốn sử dụng NavigationHelper, dưới đây là cách để có được những hành vi cũ trở lại:

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

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

Bạn cũng có thể làm điều đó trên mức độ ứng dụng, để tránh phải làm điều đó trên mỗi trang:

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

HardwareButtons class isnt available on Universal apps [link] (http://msdn.microsoft.com/en-us/library/windowsphone/develop/windows.phone.ui.input.hardwarebuttons.backpressed.aspx) – Nanoc

+2

@Nanoc vui lòng kiểm tra lại. –

+0

Im xin lỗi vì sự hiểu lầm. – Nanoc

5

Nếu bạn muốn hiển thị một hộp thoại xác nhận khi bạn nhấn nút quay lại Hãy lưu ý các mã dưới đây

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

Tôi đã thử mã ở trên nhưng hộp thoại tin nhắn không hiển thị. Thay vì chờ đợi cho phương thức ShowAsync(), nó đi tới "if" sau. Có suy nghĩ gì không? (Tôi mới dùng Windows Phone và lập trình không đồng bộ). – Leonardo

1

bạn có thể sử dụng "mô hình" NavigationHelper phù thủy cũng giúp bạn xử lý sự kiện lifecyle.

NavigationHelper là một lớp do Microsoft cung cấp (không phải là một phần của API Windows Phone), nơi bạn có thể đăng ký các trang của mình và NavigationHelper sẽ quan tâm đến FrameHistory.

Để sử dụng NavigationHelper, bạn phải thêm lớp vào dự án của mình và đăng ký Trang tại NavigationHelper khi chúng được tải. Khi bạn thêm một BasicPage (không phải là một BlankPage) vào dự án của bạn, VisualStudio thêm một thư mục có tên chung với một số lớp trợ giúp bao gồm cả lớp NavigationHelper.

Để đăng ký các trang của bạn trong NavigationHelper, bạn phải thêm mã sau vào tất cả các trang mà bạn muốn vào 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); 
    } 
} 

Để biết thêm thông tin về chủ đề này và khả năng xử lý các sự kiện vòng đời bạn có thể đọc hoặc xem articlevideo này.

Các vấn đề liên quan