按下后退按钮时跳过页面,WP7

在当前发布的WP7版本中,您无法对页面堆栈进行编程控制。

我从A开始,然后转到B,然后是C. B是新项目的数据输入页面,所以从CI回来想要逻辑上降落在A.目前我在B上听取来自C的导航并强制另一个回来到A.然而,事件不会很快发生,以阻止页面显示在屏幕上。

A – > B – > C.

C – > A.

A是顶级列表页面。 B是新项目页面。 C是项目详细信息页面。

到目前为止,这只发生在一个表单上,所以我的解决方法是在我想跳过的页面中覆盖OnNavigatedTo ,并以编程方式调用“返回”。 但是,这会产生不希望的效果,即短暂显示页面然后立即导航。

  • 有没有可行的方法来阻止闪烁?
  • 我的解决方法应该是完全控制页面导航,包括返回? 这将使页面堆栈处于一种奇怪的状态,但如果我控制所有导航,则会对用户隐藏。

我知道Mango中有一个新function可以通过编程方式从页面堆栈中弹出一个页面,但我很想知道发布的版本中是否有解决问题的方法。

另一个动机是我不知道什么版本最适合目标,最新版本,或者适合应用程序的版本。 暂时我坚持使用现场版。

您应该阅读有关解决圆形导航问题的博客文章 ,您可以下载演示非线性导航的此配方代码 。

我通过在跳过期间使根框架透明来停止闪烁。 这个例子不是我的代码。

首先在您要跳过的页面上,覆盖OnNavigatedTo并测试以查看您的来源(这是我的代码具体的位置,我跟踪我的位置):

 protected override void OnNavigatedTo(NavigationEventArgs e) { // If I've come from page C, go back again. NavigationService.GoBack(); } 

其次,在主App.xaml.cs中注册一个用于Navigating的事件处理程序(我将它放在public App()构造函数中):

 RootFrame.Navigating += RootFrame_Navigating; 

最后,将它们充实以隐藏框架并在跳过期间再次显示它:

  private bool _skipped; private void RootFrame_Navigated(object sender, NavigationEventArgs e) { RootFrame.Opacity = 100; RootFrame.Navigated -= RootFrame_Navigated; } private void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e) { if (_skipped) { _skipped = false; RootFrame.Navigated += RootFrame_Navigated; } if (e.NavigationMode == NavigationMode.Back && e.Uri.OriginalString.Contains("ThePage.xaml")) { RootFrame.Opacity = 0; _skipped = true; } } 

确定何时使页面透明的代码在我的实际代码中也有所不同,但我在答案中添加了一个实现来进行说明。 这几乎与另一个答案中链接的配方中的代码相同,但不涉及需要使用第三方DLL。

我提供了自己的答案,因为我之前看过其他答案中提供的来源,但从未注意过隐藏根框架的代码。 我没有使用非线性导航服务,只是框架透明度的代码片段(我不需要它来检测圆形导航,因为我很清楚我在应用程序中做出的设计选择并且可以自己发现它们: – )

这足以作为(当前)我遇到的一个案例中的一种解决方法,我需要跳过一个在返回时没有意义的页面。 我想当Mango问世的时候我会最好定位最新版本,所以这段代码很快就会废弃。

资料来源:

  • 用于非线性导航的App Hub代码配方
  • 非线性导航服务博客文章

除了你已经知道的闪烁方式之外,芒果之前没有办法做到这一点。

在Mango中,您可以使用NavigationService.RemoveBackEntry 。

而且它更像是一个糟糕的应用程序设计问题,而不是其他任何问题。 您不应该要求立即页面。

您的解决方法应该是设计一个不需要任何即时页面的应用程序结构。