2011-04-29 150 views
2

我在獲取Silverlight Button Click事件時遇到了問題,立即更新控件的UI元素,然後繼續執行其他一些過程。例如,更新控件的文本,然後執行一些過程。我試過調用UpdateLayout()方法,但這沒有幫助。Silverlight按鈕點擊

下面是一些示例代碼:

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    textBlock1.Text = "Testing"; 
    textBlock1.UpdateLayout();    
    UpdateLayout(); 
    Thread.Sleep(2000); 
    textBlock1.Text = "Done"; 
} 

在該樣本中,textBlock1控制永遠不會顯示文本「測試」。

+0

要跟進,使用下面的建議,我發現BackgroundWorker對象很容易實現這一點。 – rhammonds 2011-04-29 13:28:16

回答

2

這是因爲你用你的Sleep語句阻塞了UI線程,這意味着文本塊在它完成之前不會更新,但是到那時你已經將文本設置爲「完成」。

1

這不起作用。當您不退出該方法時,UI將會阻止。這就是爲什麼在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.Text屬性時,您必須使用Dispatcher調用它。