Metro App SuspensionManager覆盖SaveState行为

时间:2013-06-04 19:54:39

标签: windows-runtime microsoft-metro c#-5.0 winrt-async

如何修改Metro应用中的SuspensionManager对象,SaveState仅修改MainPage并丢弃状态导航对于任何子页面?

E.g。我有一个MainPage,可让您导航ChildPage。如果Metro App为ClosedSuspended,我希望ChildPage覆盖MainPage州值。

现在,用户下次打开应用时,MainPage应该会打开,而不是ChildPage。另外,MainPage应该显示状态,即ChildPage在应用之前更新为ClosedSuspended

有关如何安全地修改SuspensionManager对象以实现此目的的任何想法?

2 个答案:

答案 0 :(得分:1)

为什么不直接将ChildPage中的数据添加到SessionState dictionatry并在应用程序恢复时将其填入MainPage?

您甚至不需要修改SuspensionManager来执行此操作!

public BasicPage1() {
    this.InitializeComponent();

    Application.Current.Suspending += Current_Suspending;
    Application.Current.Resuming += Current_Resuming;
}

void Current_Resuming( object sender, object e ) {
    var name = SuspensionManager.SessionState["name"].ToString();
}

void Current_Suspending( object sender, Windows.ApplicationModel.SuspendingEventArgs e ) {
    SuspensionManager.SessionState.Add( "name", "danielovich" );
}

答案 1 :(得分:0)

使用 Danielovich 不完整)的建议,解决方案分为两部分:

<强>首先

  • 不再保存pageState对象中的状态,而是保存状态 使用SessionState对象。为什么?这样所有Pages都可以共享相同的State信息。

其次:

  • 为了确保NavigationState未保存,以便MainPage始终是默认页面,我们需要更改SaveFrameNavigationState中的SuspensionManager,如下所示:

    private static void SaveFrameNavigationState(Frame frame)
    {
        var frameState = SessionStateForFrame(frame);
        frame.GetNavigationState();
        frameState["Navigation"] = "1,1,0,15,Skycap.MainPage,12,0";
    }