C# 在文本框中添加文本,仅显示在结尾,所有内容一起显示在wpf中

C# 在文本框中添加文本,仅显示在结尾,所有内容一起显示在wpf中,c#,wpf,textbox,C#,Wpf,Textbox,我的程序中有一个简单的文本框。 其他功能:来自用户textbox1的另一个输入和一个按钮。 一旦用户在textbox1中输入一个值并按下按钮,我就开始检查并向用户打印消息。我的问题是我没有实时看到这些消息,一次一条。最后,消息会立即出现。 我没有定义数据绑定,因为我认为既然数据绑定很简单,我就不需要它了,还是我错了? 这是我程序的一小部分,它在按钮点击事件处理程序中 MainText.AppendText("Starting Refiling...\u2028"); foreach (Docum

我的程序中有一个简单的文本框。 其他功能:来自用户textbox1的另一个输入和一个按钮。 一旦用户在textbox1中输入一个值并按下按钮,我就开始检查并向用户打印消息。我的问题是我没有实时看到这些消息,一次一条。最后,消息会立即出现。 我没有定义数据绑定,因为我认为既然数据绑定很简单,我就不需要它了,还是我错了? 这是我程序的一小部分,它在按钮点击事件处理程序中

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));
    }
}

您正在GUI线程中执行所有循环/打印。基本上,你是在给它展示新的东西,而不是给它展示它们的时间。创建一个循环,让他在你发布的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();
  }

嗨,史蒂夫,就是这样!没想过,但后台工作人员解决了我的问题。非常感谢你。