5

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

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

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

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

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

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

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

4

1 回答 1

4

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

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

我会使用这样的方法:

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

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

propertyChanged存储此对象事件处理程序的成员变量在哪里。

Notify方法看起来像这样:

public static void Notify(
    object sender, 
    string propertyName, 
    PropertyChangedEventHandler handlers)
{ ... }

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

如果您多次收到同一对象/属性的通知,请丢弃额外的通知。如果您多次收到相同对象但不同属性的通知,请将所有属性的通知替换为一个通知。

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

于 2011-07-17T19:36:13.077 回答