如果我在命令操作中多次更新 UI 元素,则只会显示最后一次更改。据我了解,这与以下事实有关:命令操作未在 UI 线程中执行,但我无法理解如何在我希望更新控件时正确命令 UI 线程更新控件。
情况是这样的:
TextBlock
和 Button
绑定(bind)到代码隐藏文件中的值(这仅用于测试目的,我在生产中使用 MVVM):
<TextBlock Text="{Binding Text}" />
<Button Content="Test"
Command="{Binding Command}" />
Command
是一个简单的 RelayCommand
执行以下操作:
private void ChangeText()
{
Text = "Text 1";
Thread.Sleep(1000);
Text = "Text 2";
Thread.Sleep(1000);
Text = "Text 3";
}
程序只是按规定的两秒休眠并在文本框中显示 Text 3,忽略前两个 UI 更改。我希望它首先显示 Text 1,休眠一秒钟,显示 Text 2,再休眠一秒钟,然后最后显示 Text 3 .
我想有一种非常简单的方法可以实现这一点,但到目前为止我还没有在这里或其他任何地方找到合适的答案。
最佳答案
相反,命令操作是在 UI 线程上执行,除非以其他方式移动,这就是您的问题。
Thread.Sleep
正在阻塞 UI 线程,因此它无法执行任何操作来显示更新。而是使用 Task.Delay
以便方法执行不再阻塞 UI 线程(这也可以防止应用程序出现“卡住”):
private async void ChangeText()
{
Text = "Text 1";
await Task.Delay(1000);
Text = "Text 2";
await Task.Delay(1000);
Text = "Text 3";
}
关于c# - 从命令操作中更新 UI 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54244354/