gpt4 book ai didi

.net - WPF UI 更新细节

转载 作者:行者123 更新时间:2023-12-03 12:57:01 27 4
gpt4 key购买 nike

我的一般问题的插图:
使用 WPF 我经常遇到以下问题:在启动一个 UI 繁重的操作之前,我打开了一个视觉反馈控件以显示系统正忙(某种忙指示器);但是,UI 卡住而没有在其前面显示忙碌指示符。

private void MyTree_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.MyBusyIndicator.IsBusy = true;
...
//then some UI related operation
...
this.MyBusyIndicator.IsBusy = false;
}

(我不能把那个耗时的操作移到另一个线程,因为它是 UI 线程相关的操作。)
在寻找解决此类问题的可能解决方案或建议时,我阅读了一些有关 WPF(甚至 .NET 框架)UI 更新细节的内容,这是此类问题的主要原因。

所以我的问题:
那些 WPF(或 .NET 框架)UI 更新机制细节是什么, 这会阻止 UI 以与代码中定义的完全相同的顺序更新?

它确实只特定于 WPF 吗?

有哪些可能的解决方案或解决方法?

这是一个真正的问题,还是只是我的理解不足的结果?

最佳答案

该问题并非特定于 WPF - 大多数 UI 框架的行为方式相同。

这里的问题是,在 UI 线程可以处理消息之前,您的 UI 不会更新。只要你在做工作(UI相关操作),UI线程就很忙,无法处理重绘屏幕所需的消息。在这种情况下,这意味着繁忙指示器在一切完成之前不会重绘。

这里真正的解决方案是将操作移到后台线程中。虽然您说所有这些都与 UI 线程相关,但通常有一种方法可以在 WPF 中分离出其中的一部分。关键是要考虑需要很长时间的部分,然后将它们移出,而且只有它们。这通常意味着加载您的数据,但在完全加载和处理之前不要将其设置到 UI(即:设置绑定(bind)属性)。

如果这完全不可能,唯一真正的选择是设置忙碌指示器,然后使用某种机制将其他工作推到 UI 线程可以处理之后。这可以通过使用 Dispatcher.BeginInvoke 将剩余的工作推迟到“稍后”来完成,尽管这样做有点笨拙。这看起来像:

private void MyTree_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.MyBusyIndicator.IsBusy = true;

this.Dispatcher.BeginInvoke( (Action) () =>
{
// This is now sent to the dispatcher to process later, which gives the busy indicator a chance to refresh...

//then some UI related operation
this.MyBusyIndicator.IsBusy = false;
});
}

话虽如此,这也不总是完全可靠的——因为您仍在锁定您的 UI 线程。理想情况下,您永远不应该阻止 UI,因为它会阻止重绘正确发生...... DispatcherTimer 会更可靠地工作,但同样,它确实不是一个很好的处理方法。

关于.net - WPF UI 更新细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7999024/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com