c# - 从命令操作中更新 UI 元素

标签 c# wpf asynchronous icommand

如果我在命令操作中多次更新 UI 元素,则只会显示最后一次更改。据我了解,这与以下事实有关:命令操作未在 UI 线程中执行,但我无法理解如何在我希望更新控件时正确命令 UI 线程更新控件。

情况是这样的:

TextBlockButton 绑定(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/

相关文章:

.net - 使用 WorkflowInvoker 和 WorkflowApplication 有什么区别?

c# - ScintillaNET 自动完成和 CallTip

php - file_get_contents 同步或异步

python - Python请求-线程/进程与IO

c# - 如何在 asp.net 中显示多系列柱形图

c# - ASP.net 从 Site.Master.cs 类调用 Default.aspx.cs 中的函数

c# - ScrollViewer 的内容不会扩展

c# - 在 XAML 中更改 Slider 的值引发异常

java - 网络请求 C#、Java

java - 依赖jar中的异步注释,不启动新线程