gpt4 book ai didi

.net - 复杂 UI 上的批量更新

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

我有一个非常复杂的 UI,其状态栏不断变化,其中包含多种类型的状态消息,并且 UI 具有复杂的图表控件和已加载的指示性地理 map 。

现在这些小而复杂的区域的数据上下文具有同样复杂的 ViewModel,例如 StatusBarVM、ChartingVM、GeoMapVM 等……它们实现了 INotifyPropertyChanged 和 ObservableCollections。

计算我的更新,我发现我有大约 5000 个 UI 项(标签、进度条、图表数据点、bgcolorsbrushes 等),它们以每秒 1000 个数据项更新的速度快速变化。

在 WPF UI 上实现此批量数据更新的最佳方法是什么?

WPF 的绑定(bind)模型是否能够进行这种巨大的更新?如果有怎么办?因为我认为在我的情况下它不是最佳的。我也在使用 bgworker(用于进度条)并使用 DIspatcher BeginInvoke... 但关键是即使这样,更新也会挂起 UI 线程,因为调度程序消息正在排队等待完成。

我无法实现虚拟化,因为状态是实时的,我必须在我面前的 UI 上看到它们。即使几秒钟也不能错过它们(例如不断变化的卫星地理数据)。

请帮助我确定正确的工具或某种方式来实现复杂但响应迅速的 WPF UI。是 Dispatcher.PushFrame() 吗?

最佳答案

每秒有这么多更新,您将在队列中“备份”更新消息,这就是您的后台工作人员更新被阻止的原因。

要解决此问题,您需要限制引发的更新事件的数量。

我会使用这样的方法:

在我的 ViewModel 中,将 INotifyPropertyChanged 的​​正常实现替换为对将代表该对象发送通知的单例对象的调用。

private void OnPropertyChanged(string propertyName)
{
PropertyChangedNotifier.Notify(this, propertyName, propertyChanged);
}

在哪里 propertyChanged是存储此对象事件处理程序的成员变量。
Notify方法看起来像这样:
public static void Notify(
object sender,
string propertyName,
PropertyChangedEventHandler handlers)
{ ... }

在通知程序中,不要立即发送事件 - 只需存储需要发送的事实。

如果您多次收到同一对象/属性的通知,请丢弃额外的通知。如果您多次收到关于同一对象但不同属性的通知,请将通知替换为 a single one for all properties .

现在,使用 UX 线程计时器每隔 50 毫秒左右“释放”一次通知 - 仍然足够快,用户不会注意到任何差异,并且看起来像实时更新,但速度足够慢,可以检测(并删除)重复通知。

关于.net - 复杂 UI 上的批量更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6726151/

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