windows phone 7 -处理墓碑和后退键正确的性能原因



是否有正确处理墓碑和返回键的最佳实践?

正如MSDN文档中所述,您应该在OnNavigatedFrom方法中保存瞬态数据。好了,那么在墓碑设置时保存状态的代码就很清楚了。

但是现在如果你按下后退键,OnNavigatedFrom方法也被调用,如果你不添加额外的检查,你将首先保存状态到字典中,不久之后页面将被销毁。PhoneApplicationPage也会。状态字典。因此,保存代码完全是浪费CPU,磁盘和电池时间。

我是这样做的:

    protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)
    {
        // when navigating back
        if (e.NavigationMode == System.Windows.Navigation.NavigationMode.Back)
        {
            backKeyPressed = true;
        }
    }
    protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
    {
        if (backKeyPressed)
        {
            // Don't save states on back key!
            backKeyPressed = false;     // set it anyway
            return;
        }
        // Tombstoning
        // save objects
        this.SaveState("text", someText);
        ...
    }

作为一个提醒:OnNavigatingFrom将只在导航离开/从页面返回时被调用,而不是当应用程序得到墓碑。

旁注:所示代码仅涵盖只能返回的页面。这就是为什么我添加了backKeypressed到OnNavigatingFrom。您需要额外检查页面是否可以导航到另一个页面。

  1. 是否有更好的方法为您创建的每个页面做到这一点?
  2. 现在我真的要添加backKeyPressed变量和检查我创建的每个页面吗?
  3. 框架不应该为我们开发人员提供一些东西,这样我们就不用担心这个了吗?

你对此有何看法?

编辑:

更新问题,使问题更清楚。

你在OnNavigatingFrom中检查导航方向的方法确实是推荐的做法,以避免在页面从backstack中删除之前保存状态的不必要的性能影响。

有一个澄清我想添加到你的示例代码:你应该检查'NavigationMode'属性在'NavigationCancelEventArgs',以确定它是向前或向后导航。

然后,只有当它是向前导航时,才将状态保存在OnNavigatedFrom中,如示例所示。当用户向后导航时,这将有助于提高性能。

你需要知道的关于墓碑的一切都在Jeff promise的4部分的Silverlight for Windows Phone 7的真实世界墓碑系列博客文章中有介绍。您可能需要特别注意第2部分,其中Jeff谈到了当应用程序退出时清除状态。

最新更新