Silverlight で wp7 アプリを作成しています。アプリの状態はすべて に保存されNavigationContext.QueryString
ます。アプリケーションの非アクティブ化時にこれを保存でき、アプリケーションの再アクティブ化時にそのページに移動できれば、トゥームストーンの要件を処理できます。
ただし、これを行う方法がよくわかりません。NavigationContext.QueryString
のState
辞書に保存しようと思っていたのApp.xaml.cs::Application_Deactivated()
ですが、そのコードは にアクセスできませんNavigationContext.QueryString
。これを行う別の方法はありますか?
ナビゲートするたびにクエリ文字列を State ディクショナリに保存し、アプリが再アクティブ化されたときにそれを復元できると思います。または、より良いアプローチがありますか?
更新: indyfromozの回答に基づいて、次を実装したいと思います
OnNavigatedToHandler()
{
// save NavigationContext.QueryString in the State dictionary
}
冗長性を減らすために、これを から継承するクラスに実装しPhoneApplicationPage
、残りのすべてのページをそのクラスから継承することを考えました。ただし、すべてのページ クラスはpartial
、生成されたコードでも定義されているためであるという問題が発生します。生成されたコードを変更したくありません。再生成されるたびにコードを変更するのは非常に面倒だからです。
これを行うより良い方法はありますか?
更新 2 : アプリのメイン ページ (起動時に移動するページ) で現在一緒にハッキングしているものは次のとおりです。
public partial class MainPivot : PhoneApplicationPage
{
public MainPivot()
{
InitializeComponent();
Loaded += new RoutedEventHandler(MainPivot_Loaded);
PhoneApplicationService.Current.Deactivated += new EventHandler<DeactivatedEventArgs>(App_Deactivated);
MessageBox.Show("launching main pivot (state count: " + PhoneApplicationService.Current.State.Count + ")");
if (PhoneApplicationService.Current.State.Count != 0)
{
Debug.Assert(PhoneApplicationService.Current.State.ContainsKey(QueryStringKey),
"State is initialized, but contains no value for the query string");
string oldQueryString = (string)PhoneApplicationService.Current.State[QueryStringKey];
MessageBox.Show("Old query string: " + oldQueryString);
NavigationService.Navigate(new Uri(oldQueryString));
}
}
public readonly string QueryStringKey = "queryString";
void App_Deactivated(object sender, DeactivatedEventArgs e)
{
PhoneApplicationService.Current.State[QueryStringKey] = NavigationService.Source;
}
// ...
それは(ちょっと)動作しますが、醜いです。
更新 3 : wp7 OS は、ページベースのアプリで正しいページを自動的に再読み込みするようです。私は実際にページを使用しているので、ここで行う必要がある作業はそれほど多くないかもしれません。
ただし、機能していないようです。アプリを起動してページに移動し、[開始] をクリックしてから [戻る] をクリックします。画面に「再開中...」と表示されますが、ハングしているようです。私のコードは、この時点で何らかの方法で応答するはずですか? 「開始」を押した後でもデバッガーを接続したままにする方法はありますか?