Windows Phone 8.1覆盖特定页面上的后退按钮

时间:2014-11-18 11:01:44

标签: override windows-phone-8.1 back-button messagedialog

我正在开发一个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。 有什么问题?

1 个答案:

答案 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;
            }
    }
}