C#(xaml)中TextBox的文本在运行时不会发生变化

时间:2016-05-10 12:14:55

标签: c# wpf xaml textbox appendtext

我在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一样的线程冻结?

谢谢你。

3 个答案:

答案 0 :(得分:1)

您的问题是您的服务调用(显然)在UI线程上运行,因此在他们停止阻止该线程之前不会显示任何内容。

您需要将服务调用放在后台线程上,然后通过调度程序将更改编组到UI线程来更改文本框文本

答案 1 :(得分:0)

  

因此,当我的所有代码都已完成运行时,TextBox就会被填充   所有的字符串。所以,我想在那时打印字符串   我叫AppendText

如果我正确理解了该陈述,您希望每次替换 TextBox中的文字,而不是添加一些文字。如果是这种情况,您应该使用TextBox.Text属性而不是AppendText

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不会刷新 你需要强制刷新