2010-11-17 31 views
4

我有這樣的代碼:WPF沒有更新的文本框,同時在建

void wait(int ms) 
{ 
    System.Threading.Thread.Sleep(ms); 
} 

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    info.Text = "step 1"; 
    wait(1000); 
    info.Text = "step 2"; 
    wait(1000); 
    info.Text = "step 3"; 
    wait(1000); 
    info.Text = "step 4"; 
    wait(1000); 
} 

而問題是,textbox.text之後整個無效的button1_Click完成更新。它不更新AIR :(

請,那怎麼辦?

回答

9

只是這樣做。

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     ThreadPool.QueueUserWorkItem((o) => 
      { 
       Dispatcher.Invoke((Action) (() => info.Text = "step 1")); 
       wait(1000); 
       Dispatcher.Invoke((Action) (() => info.Text = "step 2")); 
       wait(1000); 
       Dispatcher.Invoke((Action) (() => info.Text = "step 3")); 
       wait(1000); 
       Dispatcher.Invoke((Action) (() => info.Text = "step 4")); 
       wait(1000); 
      }); 
    } 
+0

很大,這個工程謝謝優雅的解決方案 – DefinitionHigh 2010-11-18 18:11:00

+1

如果你可以添加爲什麼textbox-value沒有在空中更新以及你的解決方案是什麼,這將是很好的 – jklingler 2015-10-20 09:20:23

+0

在這種方法中不能保證文本字符串的附加順序,可以添加fe「step4」之前「step1」 – igorGIS 2016-11-05 19:11:13

3

GUI線程不會刷新,直到button1_Click方法返回。這就是爲什麼你只看到最後一個值。你必須把長方法分爲異步調用或使用線程。

0

測量/整理(因此渲染)是異步進行的,所以如果你想強制屏幕更新,那麼你就需要調用UpdateLayout請。

+0

相同的結果:(當我改變了代碼 info.Text = 「第1步」; info.UpdateLayout(); 等待(1000);! – DefinitionHigh 2010-11-17 15:45:27

-1

,如果你嘗試過什麼一個DispatcherFrame來模擬DoEvents將完成什麼形式:

您可能需要包含System.Security.Permissions和System.Windows.Threading。之後,在每次睡眠之後,對DoEvents()進行調用並獲得所需的結果。

[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] 
public void DoEvents() 
{ 
    DispatcherFrame frame = new DispatcherFrame(); 
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, 
     new DispatcherOperationCallback(ExitFrame), frame); 
    Dispatcher.PushFrame(frame); 
} 

public object ExitFrame(object f) 
{ 
    ((DispatcherFrame)f).Continue = false; 

    return null; 
} 

鏈接到MSDN文章:http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.pushframe.aspx