Windows Phone 7: захоронение с URI? - PullRequest
5 голосов
/ 04 ноября 2010

Я создаю приложение wp7 в Silverlight. Все состояние моего приложения хранится в NavigationContext.QueryString. Если бы это можно было сохранить при деактивации приложения и перейти на эту страницу при повторной активации приложения, это позаботилось бы о моих требованиях к захоронению.

Однако я не совсем уверен, как это сделать. Я думал о сохранении NavigationContext.QueryString в словарь State в App.xaml.cs::Application_Deactivated(), но у этого кода нет доступа к NavigationContext.QueryString. Есть ли другой способ, которым я могу сделать это?

Полагаю, я мог бы просто сохранять строку запроса в словаре состояний при каждой навигации, а затем восстанавливать ее при повторной активации приложения. Или есть лучший подход?

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

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

1 Ответ

5 голосов
/ 05 ноября 2010

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

HTH, индифромоз

...