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 应用程序未完全在 Windows 10 设备上运行
在 Windows 10 移动版上运行的 Windows Phone 8.1 应用程序的后台计时器任务中没有网络
csharp 在Windows 8.1和Windows Phone 8.1应用程序中运行的Expander控件的代码隐藏。