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

Posted

技术标签:

【中文标题】Windows Phone 8.1 通用应用程序在从第二页返回时终止?【英文标题】:Windows Phone 8.1 Universal App terminates on navigating back from second page? 【发布时间】:2014-08-11 17:20:25 【问题描述】:

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

我使用带有点击事件代码的按钮从 Page1.xaml 导航到 Page2.xaml:

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

当我在第 2 页上时,我使用硬件后退按钮,应用程序会毫无例外地关闭。它只是返回到开始屏幕。

我已经在 第 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();
    

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

发生了什么,我该如何解决?

亲切的问候, 尼尔斯

【问题讨论】:

【参考方案1】:

这是 Windows Phone 8.1 的新功能。

如果您使用 VS2013 模板创建新的 Hub 通用应用程序,您会注意到 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

【讨论】:

HardwareButtons 类在通用应用程序上不可用 link @Nanoc 请再次检查。 误会了。 我得到:命名空间“Windows”中不存在类型或命名空间名称“Phone”(您是否缺少程序集引用?)【参考方案2】:

如果您想在按下返回按钮时显示确认对话框,请记下下面的代码

    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();
            
        
    

【讨论】:

我尝试了上面的代码,但没有显示消息对话框。它不是等待 ShowAsync() 方法,而是转到以下“如果”。有什么想法吗? (我是 Windows Phone 和异步编程的新手)。【参考方案3】:

您可以使用 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);
    

有关此主题的更多信息以及处理生命周期事件的能力,您可以阅读此article 或观看此video。

【讨论】:

以上是关于Windows Phone 8.1 通用应用程序在从第二页返回时终止?的主要内容,如果未能解决你的问题,请参考以下文章

可以运行 2 个后台任务 - Windows Phone 8.1 通用应用程序?

Windows Phone 8.1 / 10应用程序开发

Windows Phone 8.1 应用程序未完全在 Windows 10 设备上运行

在 Windows 10 移动版上运行的 Windows Phone 8.1 应用程序的后台计时器任务中没有网络

csharp 在Windows 8.1和Windows Phone 8.1应用程序中运行的Expander控件的代码隐藏。

当 Windows (phone) 8.1 应用程序在前台时接收并处理通知参数