我正在开发一个 WP 8.1 XAML 应用程序。第一个页面是登录页面,第二个页面例如是历史页面。会有更多的页面,但目前无所谓。当我按下登录页面上的登录按钮时,会出现第二个(历史)页面。如果我按下历史页面上的(物理)返回按钮,它会返回登录页面。但我想禁用此功能。而不是这个,当我按下后退按钮时,会出现一个 MessageDialog,如果我在几秒钟内(例如 3 秒)再次按下,应用程序就会终止。我试图找到我的问题的答案,但它不能正常工作。我在登录页面上试过这个:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
HardwareButtons.BackPressed += HardwareButtons_BackPressed;
}
private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
if (Frame.CurrentSourcePageType.FullName == "MyAppName.History")
Application.Current.Exit();
}
当我按下第二个(历史)页面上的后退按钮时,我的应用程序终止。但是,如果我尝试计算按下后退按钮的次数,它将导航回登录页面。之后,当我再次登录并按下后退按钮时,计数器将为 2,应用程序将退出。这是我尝试过的代码:
private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
//MessageDialog msgbox = new MessageDialog("This is a popup message");
//await msgbox.ShowAsync();
//e.Handled = true;
backPressCount++;
if (backPressCount==2 && Frame.CurrentSourcePageType.FullName == "MyAppName.History")
Application.Current.Exit();
}
如果我取消注释 2 MessageDialog 行,则会显示该消息,但我将被导航回登录页面。我试图取消注释该e.Handled = true;
行,但它没有帮助。我想我应该禁用历史页面上的后退按钮或完全覆盖它。有人对我的问题有想法吗?
编辑: 我重新考虑后退按钮的行为,因为我不想使用ticker来测量两次按下之间的时间。而不是这个,我只想要一个带有问题的弹出消息,例如“你真的想退出吗?” 和 2 个按钮(是和否)。它适用于以下代码:
private async void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
e.Handled = true;
MessageDialog dlg = new MessageDialog("Are you sure you want to quit you will loose all your work ?", "Warning");
dlg.Commands.Add(new UICommand("Yes", new UICommandInvokedHandler(CommandHandler1)));
dlg.Commands.Add(new UICommand("No", new UICommandInvokedHandler(CommandHandler1)));
await dlg.ShowAsync();
}
private void CommandHandler1(IUICommand command)
{
var label = command.Label;
switch (label)
{
case "Yes":
{
Application.Current.Exit();
break;
}
case "No":
{
break;
}
}
}
我的问题是在我在弹出窗口上选择答案之前导航到登录页面。如果我按是,我的应用程序将退出,当我选择否时什么也不做。但我现在在登录页面上。我尝试使用 dlg.Show() 而不是 dlg.ShowAsync() 但它丢失了。所以我只能使用异步方法,但在这种情况下,页面导航到后台登录,因为当我按下后退按钮时,NavigationHelper 总是被调用。问题是什么?