2012-03-13 100 views
0

我想知道如何在執行Thread.sleep()之前刷新wpf元素。在下面的場景中,首先執行Thread.sleep()調用,然後更新wpf元素。在Thread.sleep執行之前更新wpf元素

我嘗試這樣做:

在button_click事件處理程序:

編輯:爲了瞭解我想要什麼,我添加了一些變量的幽會和評論。

private void button_click(object sender, RoutedEventArgs e){ 
    //fist of all, set the static variable to_change to true, then Update GUI label 
    to_change = true; 
    Thread thread = new Thread(UpdateGUI); 
    thread.Start(); 
    //Then sleep 1 second and (With label changed) 
    Thread.Sleep(1000);// one second 
    //and lately reset the value of to_change to false and update the GUI again 
    to_change = false; 
    //UpdateGUI. 
} 

而在UpdateGUI我:

private void UpdateGUI() 
    { 
     this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
      (ThreadStart)delegate() 
      { 
       this.label_success.Content = "Successful!"; 
      } 
      ); 
    } 

而且我已經試過DispatcherPriority.Send這是最高優先級

我想我錯過了一些重要的概念。

在此先感謝!

+0

這是不好的代碼 – 2012-03-13 15:37:05

+2

**從不**睡在UI線程中。你想實現什麼? – Clemens 2012-03-13 15:39:16

+0

@Clements我編輯了我的問題以更好地理解。如果你不明白我想要做什麼,請告訴我。 – 2012-03-14 18:08:28

回答

0

您可以強制WPF處理其隊列中的所有項目,方法是向調度程序調用與您要執行的任務優先級低或相同的項目。只需傳遞一個空的委託,就像這樣。

Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { })); 

這會工作;然而,這樣做不應該是「正常」,我很好奇爲什麼你需要睡覺你的主UI線程...你上面顯示的代碼是可怕的,但我不知道大的圖片,所以也許有一個這是爲什麼?

+0

謝謝@davisoa。你說睡覺主線是不好的做法?我想設置一段時間的靜態變量爲某個值,並在窗口標籤中顯示一條消息。在那段時間之後,我想再次設置舊的值。 – 2012-03-14 18:15:17

+1

然後爲自己設置一個DispatcherTimer,在該時間段之後進行打勾並重置Tick事件處理程序中的值。 – Robaticus 2012-03-14 18:20:50

+0

這就是我要找的@Robaticus。非常感謝你!。 – 2012-03-14 19:44:53

相關問題