【问题标题】:Text in a TextBox does not update instantly when change it in the code-behindTextBox 中的文本在代码隐藏中更改时不会立即更新
【发布时间】:2015-02-25 22:07:58
【问题描述】:

在下面的简化代码中,我希望文本框在获取结果时显示“请稍候..”。但是它永远不会出现,而是 textBox 只显示functionThatTakesASecondOrTwoToRun()的结果

xaml...

<Button Name="readDutButton" Content="Read DUT" Click="readDutButton_Click"/>
<TextBox Name="resultTextBox"/>

后面的代码......

    private void readDutButton_Click(object sender, RoutedEventArgs e)
    {
        resultTextBox.Text = "Please wait...";   # this never appears

        result = functionThatTakesASecondOrTwoToRun();

        resultTextBox.Text = result;
    }

【问题讨论】:

标签: c# wpf


【解决方案1】:

工作需要在后台线程中进行,例如

resultTextBox.Text = "Please wait...";   // this never appears

Task.Factory.StartNew(() => functionThatTakesASecondOrTwoToRun())
.ContinueWith((t) => resultTextBox.Text = t.Result, 
TaskScheduler.FromCurrentSynchronizationContext());

由于 UI 阻塞了线程,因此 UI 没有得到更新。 TaskScheduler.FromCurrentSynchronizationContext(),因此 ContinueWith 在 UI 线程上执行并可以访问控件。

【讨论】:

  • 等等,在其中一个地方它不起作用,因为它读取另一个文本框的值,当我尝试访问 functionThatTakesASecondOrTwoToRun() 中的另一个文本框时出现异常@“调用线程不能访问此对象,因为不同的线程拥有它。"} System.Exception {System.InvalidOperationException}
  • 首先在任务之外获取这些值,然后将它们传递给函数
  • 没问题,欢迎您!
【解决方案2】:

除了詹姆斯辛普森的回答,这里还有另一种方式:

resultTextBox.Text = "Please wait...";
Dispatcher.Invoke(() => {}, DispatcherPriority.Background);
result = functionThatTakesASecondOrTwoToRun();
resultTextBox.Text = result;

【讨论】:

    【解决方案3】:

    TextBox.Text 属性,设置为最近分配的值。因此,您无法看到“请稍候...”。您可以尝试以下方法: 1. 在文本框中显示请稍候 2.获得值后隐藏请等待文本框并在另一个文本框中显示值

    方法二: 您可以使用 System.Threading.Thread.Sleep(1000);字里行间

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      相关资源
      最近更新 更多