none
LoadState()メソッドのpageStateに付いて RRS feed

  • 質問

  • Blank App(XAML) にBasicPageを組み込んでテストしています。

    BasicPageの LoadState()メソッドのpageStateに関して質問があります。

    初めて呼ばれたときはnullで、SaveStateで保存(格納)すると

    このページが再度呼ばれたときに保存したpageStateが渡されると

    理解したのですが、いつもnullになっているようなのです。

    何か必要な処理が抜けているのでしょうか?


    2012年12月22日 4:34

回答

  • Kpbe-MMさん

    coelacanthと申します。


     ページ遷移して戻った際などはnull以外が渡されます。

     CommonディレクトリのLayoutAwarePage.csにその辺の仕組みが記述してありますので目を通してみると良いと思います。

     以下の部分です。

                var frameState = SuspensionManager.SessionStateForFrame(this.Frame);
                this._pageKey = "Page-" + this.Frame.BackStackDepth;

                if (e.NavigationMode == NavigationMode.New)
                {
                    // 新しいページをナビゲーション スタックに追加するとき、次に進むナビゲーションの
                    // 既存の状態をクリアします
                    var nextPageKey = this._pageKey;
                    int nextPageIndex = this.Frame.BackStackDepth;
                    while (frameState.Remove(nextPageKey))
                    {
                        nextPageIndex++;
                        nextPageKey = "Page-" + nextPageIndex;
                    }

                    // ナビゲーション パラメーターを新しいページに渡します
                    this.LoadState(e.Parameter, null);
                }
                else
                {
                    // ナビゲーション パラメーターおよび保存されたページの状態をページに渡します。
                    // このとき、中断状態の読み込みや、キャッシュから破棄されたページの再作成と同じ対策を
                    // 使用します
                    this.LoadState(e.Parameter, (Dictionary<String, Object>)frameState[this._pageKey]);
                }

     また、SaveSateなどの挙動も同様にLayoutAwarePage.csのOnNavigatedFromやOnNavigatedToで行っている処理が参考になります。


     

    • 回答の候補に設定 佐伯玲 2012年12月28日 6:15
    • 回答としてマーク 佐伯玲 2013年1月8日 2:13
    2012年12月26日 9:53

すべての返信

  • Kpbe-MMさん

    coelacanthと申します。


     ページ遷移して戻った際などはnull以外が渡されます。

     CommonディレクトリのLayoutAwarePage.csにその辺の仕組みが記述してありますので目を通してみると良いと思います。

     以下の部分です。

                var frameState = SuspensionManager.SessionStateForFrame(this.Frame);
                this._pageKey = "Page-" + this.Frame.BackStackDepth;

                if (e.NavigationMode == NavigationMode.New)
                {
                    // 新しいページをナビゲーション スタックに追加するとき、次に進むナビゲーションの
                    // 既存の状態をクリアします
                    var nextPageKey = this._pageKey;
                    int nextPageIndex = this.Frame.BackStackDepth;
                    while (frameState.Remove(nextPageKey))
                    {
                        nextPageIndex++;
                        nextPageKey = "Page-" + nextPageIndex;
                    }

                    // ナビゲーション パラメーターを新しいページに渡します
                    this.LoadState(e.Parameter, null);
                }
                else
                {
                    // ナビゲーション パラメーターおよび保存されたページの状態をページに渡します。
                    // このとき、中断状態の読み込みや、キャッシュから破棄されたページの再作成と同じ対策を
                    // 使用します
                    this.LoadState(e.Parameter, (Dictionary<String, Object>)frameState[this._pageKey]);
                }

     また、SaveSateなどの挙動も同様にLayoutAwarePage.csのOnNavigatedFromやOnNavigatedToで行っている処理が参考になります。


     

    • 回答の候補に設定 佐伯玲 2012年12月28日 6:15
    • 回答としてマーク 佐伯玲 2013年1月8日 2:13
    2012年12月26日 9:53
  • こんにちは、Kobe-MM さん
    フォーラムオペレータの佐伯 玲 です。

    sleeping_coelacanth さんからの情報はご確認いただけたでしょうか?
    参考になる情報だと思われましたので私のほうで「回答としてマーク」とさせて頂きました。

    寄せられた情報でわからない点などありましたら引き続きこちらのスレッドをご活用下さいませ。

    宜しくお願いいたします。
    __________________________
    日本マイクロソフト株式会社 フォーラム オペレータ 佐伯 玲

    2013年1月8日 2:13