1

私は WinRT を初めて使用し、セッション状態をいじっていました。データを収集するページに移動してから、メイン ページに戻りたいと考えています。私が使用しているナビゲーションの直前:

SuspensionManager.SessionState["CurrentState"] = someObject;

オブジェクトには、他のやや複雑なオブジェクトのリストなどが含まれています...すべてが機能しているように見えますが、これは Suspension Manager を使用する正しい方法ですか?

このトピックに関する他の投稿を見たところ、シリアル化されたすべてのクラスに [DataContract] 属性と [DataMember] 属性を使用する必要があるとの報告がありました。私はそれらを省略しましたが、それでも機能します(ページ間でデータを取得します)。では、推奨されるアプローチは何ですか?

4

1 に答える 1

1

私はあなたの質問の1つの側面を読みすぎているかもしれませんが、SuspensionManagerとの役割は、中断中にアプリケーションが実際に終了した場合SessionStateに、アプリケーションをユーザーが残した場所に戻すのに十分な情報を保存することです.

Windows 8のアプリケーション ライフサイクルでは、別のアプリがフォアグラウンドになると、アプリは「一時停止」されます。アプリが一時停止している間、その状態はすべてメモリに保持され、再アクティブ化すると (元に戻すと)、すべて* が「無料で」復元されます。

ただし、中断されたアプリは、OS によって終了される可能性もあり (たとえば、メモリ プレッシャの b/c)、アプリでそのシナリオに対応する機会がないため、実際に行っていることは、必要なものSessionState保存することです。アプリケーションが実際に終了した場合に、ユーザーが最後にいた場所を「再作成」します。これは本質的には保険です。アプリケーションが単に一時停止されている場合は、実際には必要ありません。 SessionState

「必要なもの」は灰色の領域です。たとえば、進行中のユーザー プロファイルに関するすべての情報保存することも、すべてのユーザー プロファイル データの永続ストレージにインデックスを作成するユーザー ID だけを保存することもできます。私は一般的に、よりミニマリストな見方をしており、可能な限り保持するSessionStateことはありません.

あなたの質問にSessionStateは、アプリ内のページ間で情報を渡すために使用しているという意味もありますが、それは実際の意図ではありません。通常、アプリの各ページはビュー モデルに関連付けられており、そのアプリのページを操作すると、ビュー モデルが更新され、ビュー モデルに既に存在する変更から追加の画面とエクスペリエンスが駆動されます。アプリの 1 つの画面を離れてメインの画面に戻るということは、収集した情報が何であれ永続化されていることを意味します。ビュー モデルはもちろん、データベースやローカル ストレージなどの永続的なものにも永続化されます。そのページに再度アクセスすると、ビュー モデル (またはその永続ストレージ) からデータが取り出されます。メインページはその情報を必要としないのに、なぜそれを保持するのですか?

最後に、WinRT は初めてだとおっしゃっていたので、 App Builderをチェックしてみてください。これは、消費可能なチャンクに多数のリソースをまとめて、30 日間にわたってアプリを構築する方法を導きます (ただし、すべての資料は利用可能ですが、そのため、好きなペースで消費できます :)) あなたの質問に密接に関連するライフサイクル管理の議論は、そのシーケンスの 17 日目に始まります。

※「すべて無料で復元」とは、アプリの一時停止状態が解除されたときに、何もする必要がないという意味ではありません。更新が必要な古いデータが存在する可能性があり、接続またはその他の一時的または短命のエンティティを更新/再作成する必要がある場合があります。

于 2013-04-15T03:40:08.007 に答える