2010-11-04 4 views
5

Я создаю приложение 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 автоматически перезагрузит правильную страницу в приложении на основе страницы. Я на самом деле использую страницы, поэтому, возможно, здесь не так много работы.

Однако, похоже, что это не работает. Я запускаю приложение, перехожу на страницу, нажимаю «Старт», затем нажимаю «Назад». Экран говорит «Возобновление ...», но, похоже, там висит. Должен ли мой код каким-то образом реагировать на данный момент? Есть ли способ, которым я могу поддерживать отладчик, даже после нажатия «Начать»?

ответ

5

Данные переходного процесса обычно хранятся в State dictionary provided by the PhoneApplicationService class. Данные сохраняются в событии OnNavigatedFrom страницы и восстанавливаются из события OnNavigatedTo на странице. Если вы сохранили параметры из URI страницы в словаре состояний в событии OnNavigatedFrom, который доступен на каждой странице вашего приложения, вы можете реализовать логику для считывания параметров в событии OnNavigatedTo, тем самым заботясь о Tombstoning

HTH, indyfromoz

+0

Право. Для каждой страницы я хочу, чтобы метод OnNavigatedFrom был таким же - сохраните текущий URI в 'State'. Я хотел сделать это через наследование, но похоже, что я не могу, основываясь на сгенерированном коде. Есть ли другой способ сделать это? –

+0

Вы используете MVVM в своем приложении? Я использовал инструментарий MVVMLight и использовал класс Messenger с OnNavigatedFrom/OnNavigatedTo с фильтрами сообщений для эффективного хранения данных из приложения. – indyfromoz

+0

Я не использую MVVM в своем приложении. Доступен ли MVVMLight для Windows Phone 7? –