2013-07-15 47 views
0

我相信這可能已經回答了某個地方,但我搜索了整個網絡並找不到明顯的解決方案?WPF中的c#循環方法

private void button5_Click(object sender, RoutedEventArgs e) 
{ 
    if (stopwatch.IsRunning == false) 
    { 
     stopwatch.Start(); 

     while (stopwatch.IsRunning == true) 
     { 
      label7.Content = stopwatch.Elapsed.ToString(); 
      Thread.Sleep(1000); 
     } 
    } 
} 

label7不更新,我假設它是因爲while循環永遠不會退出?

但我也嘗試過沒有喜悅嗎?

private void button5_Click(object sender, RoutedEventArgs e) 
{ 
    if (stopwatch.IsRunning == false) 
    { 
     stopwatch.Start(); 
    } 

    label7.Content = stopwatch.Elapsed.ToString(); 
    Thread.Sleep(1000); 

    button5_Click(sender, e); 
} 
+5

在UI線程中執行'Thread.Sleep()'會凍結你的應用程序。你需要使用'DispatcherTimer'或者把你的代碼放在'Task'中或者其他的東西里。 –

+1

第二個也是一個無限循環。你想做什麼? – Paparazzi

回答

0

由於您正在創建一個計時器類,您應該使用Timer Elapsed事件。在那裏更新你的用戶界面。

MSDN Timer Elapsed Event Description

正如人們所說的,睡你的進程的線程將基本上凍結申請。如果可以的話,通常要避免它,除非你有一個非常具體的理由來睡覺一個線程。 1秒也是計算機的永恆,所以你的經過時間增量應該相對較小。用戶會注意到1秒鐘,他們將有一個更難的時間通知增量.1秒和更少。

2

你不想在那裏做一個Thread.Sleep(1000)。這將使UI無法自行更新。相反,使用計時器,並在計時器滴答事件觸發時,更改標籤中的文本。

因此,對於您的示例,當您定義秒錶時,定義其間隔,然後爲'Tick'事件添加事件處理程序。當它勾選時,設置標籤的內容。

使用DispatcherTimer,因此您不必切換到UI線程,因爲您的計時器將在您的UI線程內工作。

+1

+1:OP需要'DispatcherTimer'。 –