2017-04-17 4 views
0

UWPアプリケーションが一時停止しているときにオブジェクトを保存しようとしているため、再開または起動時に復元できます。保存は、アプリケーションのSuspendingイベントが発生し、オブジェクトがResumeおよびLaunchApplicationAsyncで取得されているときに行われます。UWPプリズムSessionStateServiceがユーザーの閉鎖後に状態を失う

Visual Studioのサスペンドとレジュームをデバッグで使用すると、オブジェクトが正しく復元されますが、サスペンドとシャットダウンを実行したり、アプリケーションを自分で終了すると、オブジェクトは正しく復元されません。この動作は、RestorableStateアノテーションを持つプリミティブプロパティでも同じです。

シャットダウン後にアプリが起動したとき、私は1つの項目(「AppFrame」のキー - プリズムによって挿入されたように見える)をSessionState辞書に見ることができるので、辞書がリセットされるようです。 Suspended状態を超えて保存した値を保持するために必要な特別なことはありますか(つまり、ユーザーが終了したか、ユーザーによって閉じられたとき)ですか?ここで

はApp.xaml.csから打ち上げ方法である:

protected override Task OnLaunchApplicationAsync(LaunchActivatedEventArgs e) 
    { 
     ApplicationView.GetForCurrentView().TryEnterFullScreenMode(); 

     RootPageViewModel.ShellNavigation(typeof(SurveyListPage)); 

     RootPageViewModel.RestorePropertyStates(); 

     return Task.FromResult(true); 
    } 

そしてRestorePropertyStates方法:また

public void RestorePropertyStates() 
    { 

     if (SessionStateService.SessionState.ContainsKey(nameof(CurrentLocation))) 
     { 
      CurrentLocation = SessionStateService.SessionState[nameof(CurrentLocation)] as ViewLocation; 
     } 
    } 

プロパティを節約する方法:

public void SavePropertyStates() 
    { 
     if (SessionStateService.SessionState.ContainsKey(nameof(CurrentLocation))) 
     { 
      SessionStateService.SessionState.Remove(nameof(CurrentLocation)); 
     } 
     SessionStateService.SessionState.Add(nameof(CurrentLocation), CurrentLocation); 
    } 

答えて

0

その理由は、ViewLocationタイプは既知のタイプではないため、シリアライズすることはできません。トレード。 RegisterKnownTypeメソッドを使用して既知のタイプのリストに追加するか、stringのような単純なタイプにシリアル化しなければなりません。

通常、セッション状態の上にレイヤーを作成して、Json.NETライブラリを使用してすべての複合型をJSON文字列にシリアル化します。これにより、新しい型を追加することを忘れないようにすることができます。

+0

既知のタイプにViewLocationを追加しました。複雑な型ですが、既知の型で定義されていないオブジェクトは無視して、プリミティブなプロパティをシリアル化する必要があります。それが壊れていても(ViewLocationのプロパティをシリアル化できないため)、[RestorableState]を持つプリミティブを保存しないと機能しませんか? – fralama

関連する問題