2015-09-24 134 views
4

在Windows 10通用應用程序中,我想在按下後退按鈕時顯示MessageDialog。UWP - MessageDialog在Windows Phone和平板電腦模式下崩潰應用程序

我的網頁的代碼如下:

protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     base.OnNavigatedTo(e); 

     SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible; 
     SystemNavigationManager.GetForCurrentView().BackRequested += GamePage_BackRequested; 
    } 

    private async void GamePage_BackRequested(object sender, BackRequestedEventArgs e) 
    { 
     var dialog = new Windows.UI.Popups.MessageDialog("Are you sure ?"); 

     dialog.Commands.Add(new Windows.UI.Popups.UICommand("Yes")); 
     dialog.Commands.Add(new Windows.UI.Popups.UICommand("No")); 

     var result = await dialog.ShowAsync(); 
    } 

當我在勞克「本地計算機」的應用,很好地顯示該對話框。但是,當我將Windows設置爲「平板電腦模式」,或者當我在Windows Phone上嘗試它時,ShowAsync方法會崩潰應用程序(無錯誤)。

爲什麼應用程序崩潰?

回答

1

你應該處理反請求; e.handled = true;

private async void GamePage_BackRequested(object sender, BackRequestedEventArgs e) 
     { 
      e.handled = true; 
      var dialog = new Windows.UI.Popups.MessageDialog("Are you sure ?"); 

     dialog.Commands.Add(new Windows.UI.Popups.UICommand("Yes")); 
     dialog.Commands.Add(new Windows.UI.Popups.UICommand("No")); 

     var result = await dialog.ShowAsync(); 
    } 

您應該添加onnavigatedfrom方法來取消註冊該事件,否則會觸發兩次!

protected override void OnNavigatedFrom(NavigationEventArgs e) 
     { 
      if (gb.DetectPlatform() == Platform.WindowsPhone) 
       HardwareButtons.BackPressed -= HardwareButtons_BackPressed; 
      elde 
       SystemNavigationManager.GetForCurrentView().BackRequested -= GamePage_BackRequested; 
}; 
     } 
+0

其實我已經這樣做了,我只是簡化了我的例子...... –

2

問題似乎是應該從UI線程調用「dialog.ShowAsync()」方法。

這是我如何解決它:

private void GamePage_BackRequested(object sender, BackRequestedEventArgs e) 
    { 
     e.Handled = true; 
     Frame rootFrame = Window.Current.Content as Frame;    
     if (rootFrame.CanGoBack) 
     { 
      var d = dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => ShowConfirmationDialog(rootFrame)); 
     } 
    } 

    public async void ShowConfirmationDialog(Frame rootFrame) 
    { 
     var dialog = new Windows.UI.Popups.MessageDialog("Are you sure ?"); 

     dialog.Commands.Add(new Windows.UI.Popups.UICommand("Yes") { Id = 0 }); 
     dialog.Commands.Add(new Windows.UI.Popups.UICommand("No") { Id = 1 }); 

     var result = await dialog.ShowAsync(); 

     if (result != null && result.Label == "Yes") 
     { 
      rootFrame.GoBack(); 
     } 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     base.OnNavigatedTo(e); 
     dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher; 

     SystemNavigationManager.GetForCurrentView().BackRequested += GamePage_BackRequested; 
    } 

    protected override void OnNavigatedFrom(NavigationEventArgs e) 
    { 
     base.OnNavigatedFrom(e); 

     SystemNavigationManager.GetForCurrentView().BackRequested -= GamePage_BackRequested; 
    } 
0

有沒有辦法來完成你想要的東西 - 返回鍵處理程序需要立即回答這個問題(處理或沒有),但對話本身是異步。

在顯示對話框之前,您當然可以選擇將事件標記爲Handled,但如果用戶說「是」,那麼您無法再離開。您當然可以終止應用程序,但這是一個壞主意(請參閱最後一段)

也就是說,您通常不需要此對話框,因爲在Windows 10中,退出應用程序並不會終止它,它只是切換到以前的應用程序(或開始菜單)。用戶可以通過任務切換器輕鬆地返回到它(或再次啓動它)。

相關問題