2015-09-24 96 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中,退出应用程序并不会终止它,它只是切换到以前的应用程序(或开始菜单)。用户可以通过任务切换器轻松地返回到它(或再次启动它)。

相关问题