2011-06-15 53 views
2

我遇到了正常文本塊的刷新問題。我的代碼如下:WPF控件沒有正確刷新

public Window1() 
    { 
     InitializeComponent(); 
     Thread newt = new Thread(Tick); 
     newt.Start(); 
    } 

    void Tick() 
    { 
     while (true) 
     { 
      textBlock1.Dispatcher.Invoke(
       DispatcherPriority.Normal, 
       new Action(

      delegate() 
      { 
       textBlock1.Text = DateTime.Now.ToString("h:mm:ss"); 
       Thread.Sleep(1000); 
      } 
      )); 
     } 
    } 

隨着應用程序的運行,顯示器進入睡眠模式12:55:55。當我在1:02處重新激活顯示器時,我注意到該值每秒更新一次,但是由於小時現在沒有十個單位,所以它左對齊,並且不更新12:55:55秒的單位位置。

因此,它顯示的值爲:1:02:555。在顯示器進入睡眠狀態之前,最後5個來自12:55:55

只有在最小化和最大化窗口後,控件纔會刷新,在這種情況下,它會顯示正確刷新的時間。

這是NVidia FX 1800的顯示驅動程序問題。有沒有人遇到同樣的問題?

回答

0

將調度優先級設置爲較低的值,這將確保您的文本框被刷新。

+0

我使用了DispatcherPriority.ApplicationIdle。也沒有幫助。 – Jeevan 2011-06-15 09:45:51

0

嘗試使用textBox.InvalidateVisual()。它強制文本框重新渲染。但它具有性能影響,因爲控件應該非常確切地知道哪些部分應該重新渲染

+0

否..InValidateVisual沒有效果! :( – Jeevan 2011-06-15 09:30:12

0

您正在將UI線程在返回之前休眠1秒。你不應該讓UI線程進入睡眠狀態。我相信你打算爲你的後臺線程睡1秒,如果是的話,那麼你需要做:

void Tick() 
{ 
    while (true) 
    { 
     textBlock1.Dispatcher.Invoke(
      DispatcherPriority.Normal, 
      new Action(

     delegate() 
     { 
      textBlock1.Text = DateTime.Now.ToString("h:mm:ss"); 
     } 
     )); 

      // Executed on background thread, not UI thread 
      Thread.Sleep(1000); 
    } 
}