Приложение Windows Phone аварийно завершает работу при использовании NavigationService.GoBack () слишком рано - PullRequest
2 голосов
/ 07 октября 2011

Даже если 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 брошенного вmy 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 Ответ

0 голосов
/ 21 октября 2011

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

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

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

...