2011-08-19 43 views
1

我有一個wpf應用程序,在那個應用程序中我有一個按鈕和一個文本塊。我剋制了按鈕,並在事件響應者我做了一個簡單的循環。在那個循環中,我等待了2秒鐘,等待後,我更新了文本塊的文本,但似乎文本塊沒有更新文本。而是更新一次(最後一次使用第一項tex)。誰能知道..如何更新在一個循環中文字塊....如何通過循環更新wpf文本塊的文本?

public partial class MainWindow : Window 
{ 
    List<String> list; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     LoadList(); 
    } 



    private void LoadList() 
    { 
     list = new List<string>(); 
     list.Clear(); 
     list.Add("Chisty"); 
     list.Add("Forkan"); 
     list.Add("Farooq"); 
    } 



    private void BtnClickHandler(object sender, RoutedEventArgs e) 
    { 
     for (int i = 0; i < 3; i++) 
     {     
      System.Threading.Thread.Sleep(5000); // wait for 5 second 
      textBlock1.Text = list[i].ToString(); // assign a new text to the textblock 
      System.Console.WriteLine(list[i].ToString()); 
     } 
    } 
} 

回答

1

通知您需要實現Dispatcher
試試這個變化...

private void BtnClickHandler(object sender, RoutedEventArgs e) 
    { 
     for (int i = 0; i < 3; i++) 
     {     
      System.Threading.Thread.Sleep(5000); // wait for 5 second 
      textBlock1.Text = list[i].ToString(); 
      DoEvents(); 
      System.Console.WriteLine(list[i].ToString()); 
     } 
    } 



    public void DoEvents() 
    { 
     DispatcherFrame frame = new DispatcherFrame(true); 
     Dispatcher.CurrentDispatcher.BeginInvoke 
     (
     DispatcherPriority.Background, 
     (SendOrPostCallback)delegate(object arg) 
     { 
      var f = arg as DispatcherFrame; 
      f.Continue = false; 
     }, 
     frame 
     ); 
     Dispatcher.PushFrame(frame); 
    } 

可以在Implement Application.DoEvents in WPF

+0

謝謝shebin ...它真的有效!而我剛剛通過bug解決了......非常感謝:) –

0

你正文塊沒有更新的原因是因爲您阻止調度員查看更多信息。

讓循環發生在新線程上,並要求調度員更新文本塊。

private delegate void UpdateTextBox(); 

private void BtnClickHandler(object sender, RoutedEventArgs e) 
    { 
     string text; 
     UpdateTextBox updateTextBox =() => textBlock1.Text = text; 
     Action a = (() => 
         { 
          for (int i = 0; i < 3; i++) 
          { 
           System.Threading.Thread.Sleep(500); // wait for 5 second 
           text = list[i].ToString(); 
           textBlock1.Dispatcher.Invoke(updateTextBox); // assign a new text to the textblock 
           System.Console.WriteLine(list[i].ToString()); 
          } 
         }); 
     a.BeginInvoke(null, null); 
    }