#silverlight
#silverlight
Вопрос:
У меня возникли проблемы с получением события нажатия кнопки Silverlight для немедленного обновления элемента пользовательского интерфейса элемента управления, а затем продолжения выполнения какого-либо другого процесса. Например, обновите текст элемента управления, а затем выполните некоторый процесс. Я пытался вызвать метод UpdateLayout (), но это не помогает.
Вот несколько примеров кода:
private void button1_Click(object sender, RoutedEventArgs e)
{
textBlock1.Text = "Testing";
textBlock1.UpdateLayout();
UpdateLayout();
Thread.Sleep(2000);
textBlock1.Text = "Done";
}
В этом примере элемент управления textBlock1 никогда не будет отображать текст «Тестирование».
Комментарии:
1. В продолжение, используя приведенные ниже предложения, я обнаружил, что объект BackgroundWorker был прост в использовании для реализации этого.
Ответ №1:
Это потому, что вы заблокировали поток пользовательского интерфейса своим Sleep
заявлением, что означает, что текстовый блок не будет обновляться до тех пор, пока он не будет завершен, но к тому времени вы установите для текста значение «Готово».
Ответ №2:
Это не работает. Пользовательский интерфейс заблокируется, если вы не выйдете из метода. Вот почему в Silverlight вы обычно все делаете асинхронно:
private void button1_Click(object sender, RoutedEventArgs e)
{
textBlock1.Text = "Testing";
var myTask = /* ... */
myTask.Completed = new FancyDelegate(myTask_Completed);
}
private void myTask_Completed(object sender, RoutetEventArgs e)
{
textBlock1.Text = "Done.";
}
Если ваши задачи не имеют асинхронных функций, просто оберните их. Но имейте в виду, что когда вы хотите изменить свой textBlock1.Текстовое свойство из другого потока, вы должны вызвать его с помощью диспетчера.