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

标签 overriding 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; 行,但它没有帮助。 我想我应该禁用历史页面上的后退按钮或完全覆盖它。 有人对我的问题有想法吗?

编辑: 我重新考虑了后退按钮的行为,因为我不想使用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 总是被调用。 有什么问题?

最佳答案

如果这是你真正想做的事情,请认真考虑。更用户友好的流程是保存数据并让用户退出应用程序并返回。还要考虑如果用户以不同的方式(例如窗口或相机按钮)退出会发生什么。

也就是说,如果这是您拥有的唯一导航处理,则您列出的代码将起作用(在 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;
            }
    }
}

关于overriding - Windows Phone 8.1 覆盖特定页面上的后退按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26992703/

相关文章:

java - 什么时候调用 super.onActivityResult?

cordova - 推送通知WP8.1 "Invalid channel URL"

javascript - $(window).on ('popstate' ) 在 IE 中不起作用

javascript - iframe 中的后退按钮(类似 iGoogle 的门户的小部件)

java - 覆盖 setDefaultCloseOperation

python - 避免在Python中的父类中使用子方法

css - Phonegap - Kendo 移动用户界面覆盖我的 css

c# - 如何在Windows通用应用程序中发送带有附件的电子邮件

c# - 如何将字符串 c# 方程转换为答案

objective-c - 无法在我的导航栏中隐藏后退按钮