Вот что я пытаюсь сделать. В моем приложении WP7 я загружаю страницу с двумя StackPanels. StackPanel1 «свернут», а StackPanel2 «видимый». При загрузке страницы я запускаю запрос HttpWebRequest, а затем асинхронно обрабатываю BeginGetResponse. На данный момент я просто хочу поменять видимость двух StackPanels. Однако, поскольку BeginGetResponse выполняется асинхронно, я больше не в потоке пользовательского интерфейса и не могу управлять этими элементами управления StackPanel. Конечно, если я пытаюсь ссылаться на них, я получаю «Ссылка на объект требуется для нестатического поля, метода или свойства 'blah.StackPanel1'"
Все это имеет смысл, и я понимаю, почему.
Вот несколько вещей, которые я пробовал:
- Делегаты, но как бы то ни было, я нуждался в статической ссылке на мои элементы управления. потерпеть неудачу.
- Я попытался создать статическую ссылку на класс моей страницы, а затем использовать ее для ссылки на мои элементы управления в BeginGetResponse. Это скомпилировано, но я получил UnauthorizedAccessException «недопустимый межпоточный доступ». во время выполнения, когда я пытался ссылаться на элементы управления.
- Поиск и поиск и поиск.
- Использование 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);