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