Я создаю приложение wp7 в Silverlight. Состояние моего приложения хранится в NavigationContext.QueryString
. Если это можно было бы сохранить при дезактивации приложения, и эта страница переходила на повторную активацию приложения, это позаботилось бы о моих требованиях к гробнице.Windows Phone 7: Tombstoning с URI?
Однако я не совсем уверен, как это сделать. Я думал о сохранении NavigationContext.QueryString
в словаре State
в App.xaml.cs::Application_Deactivated()
, но этот код не имеет доступа к NavigationContext.QueryString
. Есть ли другой способ, которым я могу это сделать?
Я полагаю, что каждый раз, когда я перемещаюсь, я могу просто сохранить строку запроса в словаре State, а затем восстановить ее, когда приложение будет повторно активировано. Или есть лучший подход?
Update: на основе indyfromoz «s ответ, я хотел бы реализовать следующие
OnNavigatedToHandler()
{
// save NavigationContext.QueryString in the State dictionary
}
Чтобы уменьшить избыточность, я думал, что это реализовать в классе, который наследуется от PhoneApplicationPage
, то все остальные мои страницы наследуются от этого класса. Однако у меня возникает проблема, что все классы страниц: partial
, потому что они также определены в сгенерированном коде. Я не хочу менять сгенерированный код, потому что перестановка его каждый раз, когда он будет восстановлен, будет огромной болью.
Есть ли лучший способ сделать это?
Update 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 автоматически перезагрузит правильную страницу в приложении на основе страницы. Я на самом деле использую страницы, поэтому, возможно, здесь не так много работы.
Однако, похоже, что это не работает. Я запускаю приложение, перехожу на страницу, нажимаю «Старт», затем нажимаю «Назад». Экран говорит «Возобновление ...», но, похоже, там висит. Должен ли мой код каким-то образом реагировать на данный момент? Есть ли способ, которым я могу поддерживать отладчик, даже после нажатия «Начать»?
Право. Для каждой страницы я хочу, чтобы метод OnNavigatedFrom был таким же - сохраните текущий URI в 'State'. Я хотел сделать это через наследование, но похоже, что я не могу, основываясь на сгенерированном коде. Есть ли другой способ сделать это? –
Вы используете MVVM в своем приложении? Я использовал инструментарий MVVMLight и использовал класс Messenger с OnNavigatedFrom/OnNavigatedTo с фильтрами сообщений для эффективного хранения данных из приложения. – indyfromoz
Я не использую MVVM в своем приложении. Доступен ли MVVMLight для Windows Phone 7? –