【问题标题】:Skip a page when the back button is pressed, WP7按下后退按钮时跳过一页,WP7
【发布时间】:2011-08-18 15:14:55
【问题描述】:

在当前发布的 WP7 版本中,您无法以编程方式控制页面堆栈。

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

A -> B -> C

C -> A

A 是顶级列表页面。 B 是新项目页面。 C是商品详情页。

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

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

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

这样做的另一个动机是我不知道哪个版本最适合定位,是最新版本,还是适合应用程序的版本。目前我还是坚持使用现场版。

【问题讨论】:

    标签: c# xaml windows-phone-7


    【解决方案1】:

    您应该阅读this blog post 解决循环导航问题,您可以下载this recipe code,它演示了非线性导航。

    【讨论】:

    • 你以前用过这个吗?它似乎所做的只是为我返回页面,我已经有了这样做的代码。它是否显示它正在快速返回的页面?
    • 它似乎使 RootFrame 透明。
    • 不,我从来不需要它,但我已经看到它为您描述的场景建议了很多次。
    • +1 我以前看过这个配方,但只是通过它的实现来掩饰。再次看到它,我注意到框架透明度处理导致了我的最终解决方案。
    • 我认为你应该将你的答案标记为正确的答案(如果可以的话),并让这个答案为其他阅读此主题的人补充。 (或者可以编辑您的答案以包含指向上下文配方的链接)
    【解决方案2】:

    我已经通过在跳过期间使根框架透明来停止闪烁。此示例并非直接来自我的代码。

    首先在您希望跳过的页面上,覆盖 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 出来时,我最好定位到最新版本,所以这个代码很快就会失效。

    来源:

    【讨论】:

      【解决方案3】:

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

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

      这更像是一个糟糕的应用程序设计问题,而不是其他任何事情。您不应该要求任何内容的即时页面。

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

      【讨论】:

      • 怎么样?页面 A 是我的主页,用户点击“新商品”,B 是新商品入口页面,带你到 C,该商品的列表页面……糟糕的设计在哪里?我也知道没有支持的方式来做到这一点(因此我谈到了解决方法)并且我知道 Mango 支持......
      • 对不起,“立即页面”是什么意思?
      • 那么为什么用户不想返回到“新条目”页面呢?如果页面 B 是一个创建/类似对话的页面,您应该在创建后将用户返回到“主”屏幕,而不是将他们重定向到列表页面。如果用户想要查看列表,他们应该在您的主屏幕上,或者用户应该自己导航到那里。
      • 你从来没有告诉过 B 是什么页面。 “即时页面”是指导航上下文中的“中间”页面。
      • 主页只是所有顶级项目的列表。然后创建一个新项目并且用户接受。用户很可能不想返回到顶级项目的列表,而是希望深入到该项目(页面 C),以便继续导航。早在我遇到代码并决定解决它之前,我就发现了这个问题。如果他们在以后的版本中引入了对它的支持,我认为这不是设计错误。
      猜你喜欢
      • 2016-03-08
      • 2011-11-22
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      相关资源
      最近更新 更多