WP8で以前の状態を失うことなく、スタート画面から起動するときにアプリケーションを復元する

Windows Phone 8は、アプリケーションリストから、またはアプリケーション内の状態とナビゲーション履歴を完全に保存してホーム画面タイルからアプリケーションを再起動した後、アプリケーションの状態をすばやく再開するという素晴らしい機会をもたらしました崩壊)。



既にWindows 8とWindowsストアのアプリケーションを使用しようとした場合、スタート画面からアプリケーションを起動すると、アプリケーションを置いた場所に戻ることに気づいたかもしれません。 これはまさに、 Windows Phone 8のアプリケーションで実現する結果です。



それでは始めましょう。



WMAppManifest.xml



まず、アプリケーションのマニフェストファイルを開きます(ソリューションエクスプローラーでファイルをクリックし、Visual Studioの英語版で[ソースの表示]を選択します)。 必要なのは、 Resume値を持つActivationPolicyという属性をDefaultTask要素に追加することだけです。 このように:



<DefaultTask Name="_default" NavigationPage="MainPage.xaml" ActivationPolicy="Resume" />
      
      





概して、この変更により、アプリケーションが開始画面/アプリケーションリストから再起動されたときに、アプリケーションマニフェストのDefaultTask要素のNavigationPage属性で指定されたページに切り替えて、以前の状態に復元し始めたことを確認しました。 その直後、アプリケーションのナビゲーション履歴は次のようになります。

画像

これにより、システムが状態をクリアせず、アプリケーションを最初から起動しないため、再起動がわずかに加速されました。 しかし、先に進みます。



App.xaml.cs



ここで、アプリケーションを再起動した後、メインページへのこの不要な移行をキャンセルする必要があります。 これを行うには、App.xaml.csファイルを少し編集する必要があります(何らかの理由で、MSDNで説明されているようにSDKが動作しないことがわかるため、少し異なる方法を使用します)。



始めるために、System.Boolean型の非静的なプライベートフィールドをAppクラスに追加して、_resetと呼びましょう。



 private bool _reset;
      
      





次の手順は、プライベートのInitializePhoneApplicationメソッド(既定のテンプレートによって自動的に作成されます)を見つけ、NavigatingイベントとNavigatedイベントのラッパーを定義することにより、RootFrameの初期化を構成することです。



 RootFrame.Navigating += RootFrame_Navigating; RootFrame.Navigated += RootFrame_Navigated;
      
      





最後の手順は、これらのイベントのハンドラーメソッドの本体を変更することです。



 private void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e) { if (_reset && e.IsCancelable && e.Uri.OriginalString == "/MainPage.xaml") { e.Cancel = true; reset = false; } } private void RootFrame_Navigated(object sender, NavigationEventArgs e) { _reset = e.NavigationMode == NavigationMode.Reset; }
      
      





そしてそれだけです、目標は達成されました。 これで、アプリケーションの再起動時にアプリケーションを再開した後、ユーザーはこのアプリケーションを離れた場所を正確に取得できます。

画像

ほんの数分で、アプリケーションをより楽しく操作できるようになりました。







また、現在のページの状態のみを保持したまま、再生したり、再開するときに[戻る]ボタンの履歴をクリアしたりすることもできます。 これを行うには、Navigatedイベントハンドラーに次の行を追加します。



 if (e.NavigationMode == NavigationMode.Reset) while (RootFrame.RemoveBackEntry() != null);
      
      





画像

それだけです、ご清聴ありがとうございました。



ご注意



元の記事には、 公式文書からいくつかの点が含まれていなかったので、読者を裁判所に追加することが適切であると考えました。



All Articles