5

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

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

但是现在如果你按下返回键,这个OnNavigatedFrom方法也会被调用,如果你不添加额外的检查,你会首先将状态保存到字典中,然后页面将被销毁。PhoneApplicationPage.State 字典也是如此。所以节省代码完全是浪费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. 框架不应该为我们的开发人员提供一些东西,这样我们就不必为此担心了吗?

您对此有何看法?

编辑:

更新了问题,使其更清晰。

4

2 回答 2

2

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

我想在您的示例代码中添加一个说明:您应该检查“NavigationCancelEventArgs”中的“NavigationMode”属性以确定它是向前导航还是向后导航。

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

于 2011-04-05T21:12:05.630 回答
1

Jeff Prorise 的 4 部分Real-World Tombstoning in Silverlight for Windows Phone 7博客文章系列涵盖了您需要了解的有关墓碑的所有内容。您可能需要特别注意第 2 部分,其中 Jeff 谈到了在应用程序退出时清除状态。

于 2011-04-05T10:29:05.373 回答