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

标签 .net wpf user-interface bulk updates

我有一个非常复杂的 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/

相关文章:

.net - 有没有办法在 VB .Net 函数中返回多种类型? (不是元组,如 PHP 内部函数)

c# - WPF C# : Rearrange items in listbox via drag and drop

c# - 绑定(bind)到不在代码隐藏中的 RoutedUICommand

java - Joshua Bloch 构建器模式 - 关注线程安全时的好主意?

ios - 究竟什么代码必须放在 iOS 的主线程上?

windows - 为命令行程序生成 GUI 的工具

.net - SuspendLayout 和 BeginUpdate 的区别

.net - 如何在 .NET 中分配事件

c# - 有没有办法在 .net Framework 2 的 C# 应用程序中使用 linq?

wpf - 在ConverterParameter-Value中使用特殊字符