2012-07-26 56 views
0

我在我的程序中有一個簡單的文本框。 其他功能:來自用戶textbox1的另一個輸入和一個按鈕。 一旦用戶在textbox1中輸入一個值,然後按下按鈕,我開始檢查並向用戶打印消息。我的問題是,我沒有實時看到這些消息。消息最終會一次出現。 我沒有定義數據綁定,因爲我認爲這是一件簡單的事情,我不需要它,或者我錯了嗎? 這是我的程序的一小部分,它在按鈕單擊事件處理程序中。appendtext在文本框中只顯示在最後所有在一起wpf

MainText.AppendText("Starting Refiling...\u2028"); 
foreach (DocumentData doc in Docs) 
{ 
    try 
    { 
     wsProxy.RefileDocument(doc); 
     MainText.AppendText(String.Format("Refilling doC# {0}.{1}\u2028", doc.DocNum, doc.DocVer)); 
    } 
    catch (Exception exc) 
    { 
     if (exc.Message.Contains("Document is in use") == true) 
      MainText.AppendText(String.Format("There was a problem refilling doC# {0}, it is in use.\u2028",doc.DocNum)); 
     else 
      MainText.AppendText(String.Format("There was a problem refilling doC# {0} : {1}.\u2028", doc.DocNum, exc.Message)); 
    } 
} 

回答

1

您正在GUI線程中進行所有循環/打印。基本上,你給它新的項目來展示,而不是給它時間來展示它們。創建一個background worker並讓他在您發佈的foreach循環中完成工作。這應該允許UI線程在文本更改時更新視圖,而不是在所有更改結束時獲取最新的更新。我發佈的鏈接包括關於如何使用backgroundworker類的例子,但這是我會做的。

創建一個後臺工作:

private readonly BackgroundWorker worker = new BackgroundWorker(); 

初始化他:

public MainWindow() 
    { 
    InitializeComponent(); 

    worker.DoWork += worker_DoWork; 
    } 

他創建任務:

void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // Set up a string to hold our data so we only need to use the dispatcher in one place 
    string toAppend = ""; 
    foreach (DocumentData doc in Docs) 
    { 
     toAppend = ""; 
     try 
     { 
     wsProxy.RefileDocument(doc); 
     toAppend = String.Format("Refilling doC# {0}.{1}\u2028", doc.DocNum, doc.DocVer); 
     } 
     catch (Exception exc) 
     { 
     if (exc.Message.Contains("Document is in use")) 
      toAppend = String.Format("There was a problem refilling doC# {0}, it is in use.\u2028",doc.DocNum); 
     else 
      toAppend = String.Format("There was a problem refilling doC# {0} : {1}.\u2028", doc.DocNum, exc.Message); 
     } 

     // Update the text from the main thread to avoid exceptions 
     Dispatcher.Invoke((Action)delegate 
     { 
     MainText.AppendText(toAppend); 
     }); 
    } 
} 

開始了他,當你按下按鈕事件:

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
    worker.RunWorkerAsync(); 
    } 
+0

嗨史蒂夫,就是這樣!沒有想到,但後臺工程師解決了我的問題。非常感謝你。 – dusm 2012-07-29 13:12:17

+0

很高興我能幫到你。 – steveg89 2012-07-30 11:37:55

相關問題