Приложение Windows Phone аварийно завершает работу при использовании NavigationService.GoBack() слишком рано

Даже если NavigationService.CanGoBack возвращается True, NavigationService.GoBack() бросает мне эти исключения:

A first chance exception of type 'System.ArgumentException' occurred in System.Windows.dll
A first chance exception of type 'System.Reflection.TargetInvocationException' occurred in 

Это происходит систематически в двух случаях, в то время как третий работает нормально:

  • Сбой, если я позвоню NavigationService.GoBack() в OnNavigatedTo()
  • Сбои, если я позвоню NavigationService.GoBack() как результат WebException бросили в мой HTTPWebRequest когда Интернет недоступен [1]
  • Работает нормально, если интернет доступен и я звоню NavigationService.GoBack() когда мой HTTPWebRequest получил результаты, проанализировал их и показал их.

Моя теория заключается в том, что я не могу позвонить GoBack() слишком рано после перехода со страницы на другую... Мой вопрос: как программно вернуться обратно в стек навигации, когда HTTPWebRequest не загружается?

Изменить: я решил сделать это по-другому, но я думаю, что мои проблемы могут быть связаны с анимацией навигации и инструментарием Windows Phone C# (я использую февраль 2011)


[1] Подробности моего кода по делу 2:

У меня простой HTTPWebRequest, Мой обратный вызов делает это, и мое приложение падает в режиме полета. Линия NavigationService.GoBack() несет ответственность, хотя NavigationService.CanGoBack возвращается true,

        try
        {
            response = request.EndGetResponse(result);
        }
        catch (WebException)
        {
            Dispatcher.BeginInvoke(() =>
            {
                NavigationService.GoBack();
            });
        }

Я пытался с помощью Deployment.Current.Dispatcher.BeginInvoke() также.

1 ответ

Вы можете попробовать использовать WebClient client = new WebClient();затем используйте client.DownloadStringAsync(new Uri("request_url")); чтобы сделать запрос и подписаться на client.DownloadStringCompleted событие для получения ваших данных, когда запрос будет завершен. После анализа данных в обработчике событий вы можете вызвать NavigationService.GoBack(); или перейдите на любую страницу, которую вы хотите.

Кроме того, если вы пытаетесь сделать что-то в OnNavigatedTo событие и столкнуться с проблемой, вы можете попробовать использовать OnNavigatingFrom вместо этого (на предыдущей странице) отмените навигацию e.Cancel = true;, сделайте свое дело, как в запросе и прочем, затем получите фрейм приложения и перейдите к e.Uri (в основном продолжение навигации вы ранее отменили).

Хотя эта секунда может также представлять решение, я думаю, что первое лучше, поскольку оно выполняет всю асинхронную работу, таким образом не блокируя ваш поток пользовательского интерфейса. Это то, что я обычно использую в своих приложениях. Надеюсь, поможет.

Другие вопросы по тегам