我正在开发一个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;
行,但它没有帮助。
我想我应该禁用历史记录页面上的后退按钮或完全覆盖它。
有人知道我的问题吗?
修改 我重新考虑后退按钮的行为,因为我不想使用自动收报机来测量2按下之间的时间。而不是这个,我只想要一个带有问题的弹出消息,例如“你真的想要退出吗?”和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。 有什么问题?
答案 0 :(得分:9)
如果这是你真正想做的事情,请认真考虑。更加用户友好的流程是保存数据并让用户退出应用程序并返回。还要考虑如果用户以不同的方式退出,例如窗口或相机按钮会发生什么。
也就是说,如果这是您唯一的导航处理(在BlankPage模板中尝试),您列出的代码将会起作用。我怀疑它不是唯一的,你正在使用像BasicPage这样更全面的模板中的NavigationHelper。在这种情况下,NavigationHelper的GoBackCommand可能会触发并调用Frame.GoBack。
您可以通过在NavigationHelper的GoBackCommand属性上设置自己的RelayCommand来覆盖此行为:
RelayCommand _checkedGoBackCommand;
public BasicPage1()
{
this.InitializeComponent();
this.navigationHelper = new NavigationHelper(this);
this.navigationHelper.LoadState += this.NavigationHelper_LoadState;
this.navigationHelper.SaveState += this.NavigationHelper_SaveState;
_checkedGoBackCommand = new RelayCommand(
() => this.CheckGoBack(),
() => this.CanCheckGoBack()
);
navigationHelper.GoBackCommand = _checkedGoBackCommand;
}
private bool CanCheckGoBack()
{
return true;
}
private async void CheckGoBack()
{
Debug.WriteLine("CheckGoBack");
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;
}
}
}