0

アプリが Windows によって終了された場合 (たとえば、中断されたが、Windows がメモリを解放する必要があるため、アプリをプリエンプトする場合)、アプリを再起動すると、OnLaunched() イベントが発生し、終了したかどうかをテストできます。 (またはユーザーが単に閉じた):

    . . .
        if ((args.PreviousExecutionState == ApplicationExecutionState.Terminated) ||
            (args.PreviousExecutionState == ApplicationExecutionState.ClosedByUser))
        {
        }
    . . .

終了した場合、最初のページ (異なる場合) ではなく、以前の場所/ページから再開したいと考えています。これどうやってするの?疑似コードは次のようになります。

if (CurrentPage != LastSavedPage)
{
    CurrentPage = LastSavedPage;
    // or: Frame.Navigate(typeof(LastSavedPage)
}

アップデート

だから、これは私がすべきことに対する私の見解ですが、私はまだ「それについて疑問を持っています」(コメントとそれに続くコードを参照してください)

// OnNavigateTo in each page:
Settings.Values["CurrentPageType"] = this.GetType();
Settings.Values["CurrentPageParam"] = args.Parameter; 
//Will the line directly above work even if args.Parameter is empty, or must I do something like:
if (null != args.Parameters)
{
     Settings.Values["CurrentPageParam"] = args.Parameter; 
}

//OnLaunched in app.xaml.cs
                if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                    if ((localSettings.Values.ContainsKey("CurrentPageType")) &&
                        (localSettings.Values.ContainsKey("CurrentPageParam")))
                    {
                        rootFrame.Navigate((Type)localSettings.Values["CurrentPageType"],
                                                                     localSettings.Values["CurrentPageParam"]);
                    }
                }

更新 2

このコードで例外が発生します。

    ApplicationData.Current.LocalSettings.Values["CurrentPageType"] = this.GetType();
    ApplicationData.Current.LocalSettings.Values["CurrentPageParam"] = args.Parameter;

タイプ 'System.Exception' の例外が mscorlib.dll で発生しましたが、ユーザー コードでは処理されませんでした WinRT 情報: アプリケーション データ ストアに書き込まれる値をシリアル化しようとしてエラーが発生しました 追加情報: このタイプのデータはサポートされていません。この例外のハンドラがあれば、プログラムは安全に続行できます。

GetType() の呼び出しに「.ToString()」を追加すると、爆発しません...

4

3 に答える 3

1

もちろん!OnNavigatedTo をオーバーライドするときは、次の 2 つのことを永続化する必要があります。

1) 現在のクラスのタイプ。次のようなものです。

Settings.Values["CurrentPageType"] = this.GetType();

2) 現在のページに渡されるパラメーター。次のようなものです。

Settings.Values["CurrentPageParams"] = e.Parameters;

最初の注意点は、パラメーターがシリアライズ可能でなければならないということです。それはあなた次第です。

2 つ目の考慮事項は、アプリケーションがナビゲーションのためにバックスタックに依存しているかどうかです。その場合、現在のページのタイプだけでなく、その背後にあるブレッドクラムも保持する必要があります。それもあなた次第です。

次に、次のようなものです。

Frame.Navigate(
    (Type)Settings.Values["CurrentPageType"], 
    Settings.Values["CurrentPageParams"]);

null などを確認してください。しかし、一言で言えば、それが方法です。

于 2012-11-27T22:49:40.430 に答える
1

他の回答に追加するには(TL; DRバージョンの場合は下にスキップしてください)...

C#/XAML Grid または Split テンプレートを使用している場合、または空白ページ以外をプロジェクトに追加している場合は、ほとんどの配管をセットアップするSuspensionManagerの「ヘルパー」クラスをプルすることになります。

空白以外の各ページ extends は、ジェリーが言及したような実装LayoutAwarePageを提供します。OnNavigatedToただし、各ページでは、LoadStateandSaveStateメソッドの本体を入力するだけで済みます。保持したいものはすべてpageStateパラメーターに入れます。また、何もしなくても、ユーザーが表示していたページが保持されます。保存 (および復元) したいデータを追加するだけで済みます。

アプリケーションディレクトリ内のpageStateファイルに保存されます(設定を使用する場合とは異なります)。設定を手動で行う場合は、すべてが Windows ランタイム タイプ (主に単純な型と配列) であることを確認する必要がありますが、pageState を使用すると、オブジェクトもシリアル化できます。

実際のコードと詳細な説明については、サンプル ウォークスルーアプリのライフサイクルと状態の管理をご覧ください。

于 2012-11-28T01:58:21.197 に答える
1

アプリが一時停止されたときに最後に表示されていたページの種類を覚えておいてください。新しい開始後、App クラスの適切なページに移動します。これを実装するのはそれほど難しくありません。

于 2012-11-27T22:26:24.957 に答える