我在VisualStudio中完成了一个GUI,并使用TextBox向用户显示正在发生的事情。
我使用myTextBox.AppendText
来显示
myTextBox.AppendText("\n" + DateTime.Now.ToLocalTime() + ": " + serviceName + " waiting for stopping");
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped);
service.Close();
myTextBox.AppendText("\n" + DateTime.Now.ToLocalTime() + ": " + serviceName + " has been stopped correcly");
等等。无论如何,TextBox仅在完成所有作业时填充文本。因此,当我的所有代码都已完成运行时,TextBox将填充所有字符串。所以,我想在调用AppendText
时打印字符串。我错过了什么吗?也许是像java一样的线程冻结?
谢谢你。
答案 0 :(得分:1)
您的问题是您的服务调用(显然)在UI线程上运行,因此在他们停止阻止该线程之前不会显示任何内容。
您需要将服务调用放在后台线程上,然后通过调度程序将更改编组到UI线程来更改文本框文本
答案 1 :(得分:0)
因此,当我的所有代码都已完成运行时,TextBox就会被填充 所有的字符串。所以,我想在那时打印字符串 我叫AppendText
如果我正确理解了该陈述,您希望每次替换 TextBox
中的文字,而不是添加一些文字。如果是这种情况,您应该使用TextBox.Text
属性而不是AppendText
设置此属性用指定的字符串替换文本框的内容。
使用此方法将文字添加到现有文字
答案 2 :(得分:0)
这就是我使用的
public static class ExtensionMethods
{
private static Action EmptyDelegate = delegate() { };
public static void Refresh(this UIElement uiElement)
{
uiElement.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate);
}
}
private void LoopingMethod()
{
for (int i = 0; i < 10; i++)
{
label1.Content = i.ToString();
label1.Refresh();
Thread.Sleep(500);
}
}
通常,在完成后面的代码完成后,UI不会刷新 你需要强制刷新