Windows Phone 8.1通用应用程序在从第二页导航返回时终止

本文关键字:二页 导航 终止 返回 1通 Phone 应用程序 Windows | 更新日期: 2023-09-27 18:09:52

我的Windows Phone 8.1通用应用程序中有2个页面。

我从Page1导航。xaml到Page2。Xaml通过使用带有click事件代码的按钮:

this.Frame.Navigate(typeof(Page2));

当我在Page2上,并且我使用硬件后退按钮时,应用程序关闭,没有异常或任何东西。它只是返回到开始界面。

我已经在第2页上尝试了以下操作:

public Page2()
    {
        this.InitializeComponent();
        Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    }
    void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)
    {
        Frame.GoBack();
    }

据我所知,我没有清除后堆栈。

发生了什么,我该如何解决这个问题?

亲切的问候,尼尔斯·

Windows Phone 8.1通用应用程序在从第二页导航返回时终止

这是Windows Phone 8.1的新功能。

如果你使用VS2013模板创建一个新的Hub Universal App,你会注意到Common文件夹中有一个名为NavigationHelper的类。

这个NavigationHelper给了你一个提示,告诉你如何正确地响应返回按钮。所以,如果你不想使用NavigationHelper,下面是恢复旧行为的方法:

public BlankPage1()
{
    this.InitializeComponent();
    HardwareButtons.BackPressed += HardwareButtons_BackPressed;
}
void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
    if (Frame.CanGoBack)
    {
        e.Handled = true;
        Frame.GoBack();
    }
}

你也可以在应用程序级别这样做,以避免在每个页面上都这样做:

public App()
{
    this.InitializeComponent();
    this.Suspending += this.OnSuspending;
    #if WINDOWS_PHONE_APP
    HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    #endif
}
#if WINDOWS_PHONE_APP
void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame != null && rootFrame.CanGoBack)
    {
        e.Handled = true;
        rootFrame.GoBack();
    }
}
#endif

如果您想在按后退键时显示确认对话框,请注意下面的代码

    private async void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
    {
        e.Handled = true;
        if (Frame.CanGoBack)
        {
            Frame.GoBack();
        }
        else
        {
            var msg = new MessageDialog("Confirm Close");
            var okBtn = new UICommand("OK");
            var cancelBtn = new UICommand("Cancel");
            msg.Commands.Add(okBtn);
            msg.Commands.Add(cancelBtn);
            IUICommand result = await msg.ShowAsync();
            if (result != null && result.Label == "OK")
            {
                Application.Current.Exit();
            }
        }
    }

您可以使用NavigationHelper "模式",它还可以帮助您处理生命周期事件。

NavigationHelper是一个由Microsoft提供的类(它不是Windows Phone API的一部分),你可以在其中注册你的页面,NavigationHelper负责FrameHistory。

要使用NavigationHelper,您必须将类添加到项目中,并在加载页面时在NavigationHelper中注册页面。当你添加一个BasicPage(不是一个BlankPage)到你的项目时,VisualStudio会添加一个名为common的文件夹,其中包含一些辅助类,包括NavigationHelper类。

要在NavigationHelper中注册您的页面,您必须将以下代码添加到您想要NavigationHelper的所有页面。

public sealed partial class MySuperCoolPage : Page {
    private readonly NavigationHelper navigationHelper;
    public MySuperCoolPage() {
        InitializeComponent();
        navigationHelper = new NavigationHelper(this);
    }
    protected override void OnNavigatedFrom(NavigationEventArgs e){
        this.navigationHelper.OnNavigatedFrom(e);
    }
    protected override void OnNavigatedTo(NavigationEventArgs e) {
        navigationHelper.OnNavigatedTo(e);
    }
}

有关本主题的更多信息以及处理生命周期事件的能力,您可以阅读这篇文章或观看这个视频。