.net 复杂用户界面上的批量更新
我有一个非常复杂的UI,它有一个不断变化的状态栏,有多种类型的状态消息,UI有一个复杂的图表控件和一个加载的指示性地理地图 现在,这些小而复杂区域的数据上下文具有同样复杂的视图模型,如StatusBarVM、ChartingVM、GeoMapVM等。。。它们实现INotifyPropertyChanged和ObservableCollections 计算我的更新,我发现我有大约5000个UI项(标签、进度条、图表数据点、BGColorsBush等),它们以每秒1000个数据项更新的速度变化 在WPF UI上实现批量数据更新的最佳方法是什么 WPF的绑定模型能够进行如此大规模的更新吗?如果是,怎么做?因为我发现在我的情况下它不是最佳的。我也在使用bgworker(用于progressbars)和DIspatcher BeginInvoke。。。但关键是,即使这样,当调度程序消息排队等待完成时,更新也会挂起UI线程 我无法实施虚拟化,因为状态是实时的,我必须在我面前的UI上看到它们。。我不能错过他们,即使是一两秒钟(例如,不断变化的卫星地理数据).net 复杂用户界面上的批量更新,.net,wpf,user-interface,bulk,updates,.net,Wpf,User Interface,Bulk,Updates,我有一个非常复杂的UI,它有一个不断变化的状态栏,有多种类型的状态消息,UI有一个复杂的图表控件和一个加载的指示性地理地图 现在,这些小而复杂区域的数据上下文具有同样复杂的视图模型,如StatusBarVM、ChartingVM、GeoMapVM等。。。它们实现INotifyPropertyChanged和ObservableCollections 计算我的更新,我发现我有大约5000个UI项(标签、进度条、图表数据点、BGColorsBush等),它们以每秒1000个数据项更新的速度变化 在W
请帮助我确定一个正确的工具或某种方法来实现一个复杂但高度响应的WPF UI。是Dispatcher.PushFrame()?每秒更新这么多,您将在队列中收到“备份”的更新消息,这就是您的后台工作程序更新被阻止的原因 要解决这个问题,您需要限制抛出的更新事件的数量 我会使用这样的方法:
public static void Notify(
object sender,
string propertyName,
PropertyChangedEventHandler handlers)
{ ... }
在我的ViewModels中,将INotifyPropertyChanged的正常实现替换为对将代表该对象发送通知的singleton对象的调用
private void OnPropertyChanged(string propertyName)
{
PropertyChangedNotifier.Notify(this, propertyName, propertyChanged);
}
其中propertyChanged
是存储此对象事件处理程序的成员变量
Notify
方法如下所示:
public static void Notify(
object sender,
string propertyName,
PropertyChangedEventHandler handlers)
{ ... }
在通知程序中,不要立即发送事件-只存储需要发送的事实
如果同一对象/属性多次收到通知,请放弃额外的通知。如果您多次收到同一对象但不同属性的通知,请将该通知替换为
现在,使用UX线程计时器每隔50毫秒左右“释放”一次通知-速度仍然足够快,用户不会注意到任何差异,看起来像是实时更新,但速度足够慢,可以检测(并删除)重复通知。这看起来是一个很好的实现,尽管我必须问一下是基于缓冲区的UI更新吗(跟其他UI技术,如ASP.NET、WiFrm等)一样,你在这里讨论过吗?我不确定,术语“基于缓冲区的UI更新”不是我认识到的。你应该考虑使用这个框架来批量更新:用时间查看部分缓冲区。