Пост был переписан, чтобы лучше соответствовать текущей проблеме.
У меня есть кнопка x:Name="selectVesselButton"
. При нажатии кнопки он пытается установить соединение с сервером, на что уходит секунда или две. Первоначально я хотел, чтобы кнопка была серой, когда она загружала и десериализировала файл json из соединения.
Мой старый код (перед асинхронной попыткой обновления кнопки):
// disabling the button to prevent spam clicking.
string buttonText = selectVesselButton.Text;
selectVesselButton.IsEnabled = false;
selectVesselButton.Text = "loading...";
// retrieve data for speed page.
RetrieveData();
// redirect to next info block if build was successfull.
FocusSpeedblock();
// enabling the button again.
selectVesselButton.Text = buttonText;
selectVesselButton.IsEnabled = true;
Проблема с этим кодом заключалась в том, что визуальные элементы кнопок не обновлялись до тех пор, пока не был завершен RetrieveData (), что полностью противоречило цели этого. Это произошло потому, что код для обновления интерфейса и код для загрузки и десериализации объекта находились в одном потоке.
Однако, следуя совету Ивана, я произвел загрузку и десериализацию Async, что устранило эту проблему (больше похоже на ее перемещение).
Это работает довольно хорошо, но у меня все еще есть проблемы с автоматическим обновлением интерфейса. У меня есть несколько меток, которые необходимо обновить на основе вывода файла JSON. Значение меток обновляется в фоновом режиме, но обновляется только визуально, когда я взаимодействую с метками (т.е. прокручиваю вид прокрутки, на котором они находятся). Проверьте правку 3 для более подробной информации.
РЕДАКТИРОВАТЬ 3:
Когда второй поток закончен, он должен вызвать UpdateSpeedLabels () и обновить некоторые метки. Тем не менее, они обновляются в codebehind, без немедленного обновления интерфейса. Они обновляются только если я взаимодействую с этими ярлыками.