Нажатие кнопки Silverlight

#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.Текстовое свойство из другого потока, вы должны вызвать его с помощью диспетчера.