如何在WPF UI中强制更新?

如何在WPF UI中强制更新?,wpf,mvvm,Wpf,Mvvm,我使用的是MVVM,所以我有一个类来表示我的数据。它实现了INotifyPropertyChanged,并且我拥有公共属性及其set和get访问器方法。 每个属性上的集合都会引发NotifyPropertyChanged事件 我的XAML中有一个状态字段,它是一个矩形。背景颜色绑定到my ViewModel中的属性,该属性是枚举类型的属性。我有一个转换器,可以将枚举值转换为颜色。 这在某些时候很管用。启动时,它将状态设置为断开连接,矩形变为灰色。 然而,就在调用代码进行连接之前,我将状态设置为“

我使用的是MVVM,所以我有一个类来表示我的数据。它实现了INotifyPropertyChanged,并且我拥有公共属性及其set和get访问器方法。 每个属性上的集合都会引发NotifyPropertyChanged事件

我的XAML中有一个状态字段,它是一个矩形。背景颜色绑定到my ViewModel中的属性,该属性是枚举类型的属性。我有一个转换器,可以将枚举值转换为颜色。 这在某些时候很管用。启动时,它将状态设置为断开连接,矩形变为灰色。 然而,就在调用代码进行连接之前,我将状态设置为“连接”,矩形应该变成橙色,但仍然是灰色。 连接完成后,状态变为“已连接”,矩形变为绿色

调试时,它会点击属性集方法中的断点,也会点击在转换器中选择橙色的代码,但不会更新显示以显示橙色

这可能是因为建立连接的代码占用了CPU,UI在建立连接之前没有机会更新,此时它会按预期变为绿色。不幸的是,建立连接的代码不是我的,所以我无法更改它

所以我的问题是:在我调用连接代码之前,是否可以让UI强制更新? 我试着增加一个延迟,但没有成功。 由于它发生在我的VM代码中(而不是代码隐藏),我不知道如何链接回XAML中的对象来更新它们

这可能是因为建立连接的代码占用了CPU,UI在建立连接之前没有机会更新,此时它会按预期变为绿色。不幸的是,建立连接的代码不是我的,所以我无法更改它

2020年,在执行某些操作时冻结GUI是不可接受的。请把它保存在1980年

如果在冻结GUI之前强制执行足够的消息周期来更新GUI,这并不重要,但您仍然在冻结它。在这个过程中,任何鼠标或键盘的点击都会使窗口重影,并在Windows 10中弹出一个关闭的对话框——可以理解,您的代码的行为与被破坏、冻结的代码完全相同


要么克服对更改现有代码的恐惧,用适当的
async
代码对其进行重构,要么将其放入单独的线程中。

建立连接的代码肯定不是“占用CPU”,而是可能只是阻塞UI线程。通常的解决方法是使其异步并等待它,或者将其包装在等待的任务中。是的。阻止UI线程就是我的意思。当时我没有想到这个词,这就解决了它。我将连接代码放在一个单独的线程中,UI现在完全更新了。谢谢