2011-06-15 50 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); 
    } 
}