Windows Phone 7: управление ссылочной страницей в поточно-ориентированном режиме - PullRequest
0 голосов
/ 09 марта 2012

Вот что я пытаюсь сделать. В моем приложении WP7 я загружаю страницу с двумя StackPanels. StackPanel1 «свернут», а StackPanel2 «видимый». При загрузке страницы я запускаю запрос HttpWebRequest, а затем асинхронно обрабатываю BeginGetResponse. На данный момент я просто хочу поменять видимость двух StackPanels. Однако, поскольку BeginGetResponse выполняется асинхронно, я больше не в потоке пользовательского интерфейса и не могу управлять этими элементами управления StackPanel. Конечно, если я пытаюсь ссылаться на них, я получаю «Ссылка на объект требуется для нестатического поля, метода или свойства 'blah.StackPanel1'"

Все это имеет смысл, и я понимаю, почему.

Вот несколько вещей, которые я пробовал:

  1. Делегаты, но как бы то ни было, я нуждался в статической ссылке на мои элементы управления. потерпеть неудачу.
  2. Я попытался создать статическую ссылку на класс моей страницы, а затем использовать ее для ссылки на мои элементы управления в BeginGetResponse. Это скомпилировано, но я получил UnauthorizedAccessException «недопустимый межпоточный доступ». во время выполнения, когда я пытался ссылаться на элементы управления.
  3. Поиск и поиск и поиск.
  4. Использование Deployment.Current.Dispatcher.BeginInvoke для запуска в потоке пользовательского интерфейса.

Как я могу статически ссылаться на эти элементы управления?

ИЛИ есть ли лучший способ сделать то, что я делаю?

EDIT:

Вот мой HttpWebRequest

if (NetworkInterface.GetIsNetworkAvailable())
        {
            HttpWebRequest httpWebRequest = HttpWebRequest.CreateHttp("http://urlThatWorks.com");
            httpWebRequest.Method = "GET";
            httpWebRequest.BeginGetResponse((asyncresult) =>
                //do processing of my return here

                //then here is the problem
                StackPanel1.Visibility = System.Windows.Visibility.Visible;
                StackPanel2.Visibility = System.Windows.Visibility.Collapsed;

           }, httpWebRequest);

        }

ДРУГОЕ РЕДАКТИРОВАНИЕ:

А вот как я пытался с Deployment.Current.Dispatcher.BeginInvoke

  httpWebRequest.BeginGetResponse((asyncresult) =>
      //do processing of my return here

      Deployment.Current.Dispatcher.BeginInvoke(() =>
          {
              StackPanel1.Visibility = System.Windows.Visibility.Visible;
              StackPanel2.Visibility = System.Windows.Visibility.Collapsed;
          });
  }, httpWebRequest);

1 Ответ

1 голос
/ 09 марта 2012

Вы на самом деле не хотите статическую ссылку, вам нужен потокобезопасный способ доступа к ним.
Вы можете выполнить ее в потоке пользовательского интерфейса:

Deployment.Current.Dispatcher.BeginInvoke(()=> SomeMethod);

или

Deployment.Current.Dispatcher.BeginInvoke(()=> {  // code });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...