2011-08-19 2 views
1

나는 wpf 응용 프로그램이 있고 그 응용 프로그램에는 단추와 텍스트 블록이 있습니다. 나는 버튼을 cliked했고 이벤트 응답자에서 나는 단순한 루핑을했다. 그 루프에서 2 초 기다렸다가 대기 후 텍스트 블록의 텍스트를 업데이트했지만 텍스트 블록이 텍스트로 업데이트되지 않는 것 같습니다. 그보다 한 번 업데이트됩니다 (마지막 항목에서는 첫 번째 항목 tex와 함께). 사람이 .... 루프에서 TextBlock을 업데이트하는 방법 .. 당신은 그것을이 시작 화면 예제에서 구현되는 일부 구간에서 텍스트를 업데이트 할 MessageListener를하고 DispatcherHelper 클래스를 사용하여 논리를 구현해야루프를 통해 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 ... 정말 효과가 있습니다! 그리고 난 그냥 버그로 해결했습니다 ... 덕분에 많이 :) –

0

다음은 TextBlock에이 업데이트되지 않은 것 이유는 발송자를 차단하고 있기 때문이다에서 더 많은 정보를 볼 수 있습니다.

새 스레드에서 루프를 발생시키고 디스패처에게 텍스트 블록을 업데이트하도록 요청하십시오.

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); 
    } 
관련 문제