[英]MessageDialog crashes when called - Windows Phone Store app
[英]UWP - MessageDialog crashes the app on Windows Phone and tablet mode
在 Windows 10 通用应用程序中,我想在按下后退按钮时显示 MessageDialog。
我的页面代码如下:
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 方法会使应用程序崩溃(没有错误)。
为什么应用程序崩溃?
问题似乎是应该从 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;
}
你应该处理 backrequest ; 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;
};
}
没有办法完成你想要的——后退键处理程序需要立即回答(处理或不处理),但对话框本质上是异步的。
您当然可以选择在显示对话框之前将事件标记为已Handled
,但是如果用户说“是”,您就无法离开。 你当然可以终止应用程序,但这是一个坏主意(见最后一段)
也就是说,您通常不需要此对话框,因为在 Windows 10 中,退出应用程序不会终止它,它只是切换到上一个应用程序(或“开始”菜单)。 用户可以通过任务切换器轻松返回它(或再次启动它)。
当我在Application.UnhandledException
事件处理程序中调用MessageDialog.ShowAsync
时,我的 UWP 应用程序崩溃了,这是我搜索答案时的最佳结果。
我通过在调用MessageDialog.ShowAsync
之前设置UnhandledExceptionEventArgs.Handled = true
解决了这个问题。
这在另一个 SO question 中有详细记录,但是直到我找到解决方案之后我才找到答案,因为我没有意识到从Application.UnhandledException
调用该方法很重要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.