WPF*_*-it 5 .net wpf user-interface bulk updates
我有一个非常复杂的UI,具有不断变化的状态栏,具有多种类型的状态消息和具有复杂图表控件和加载的指示性地理地图的UI.
现在,这些小但复杂区域的数据上下文具有同样复杂的ViewModel,如StatusBarVM,ChartingVM,GeoMapVM等......它们实现了INotifyPropertyChanged和ObservableCollections.
计算我的更新我发现我有大约5000个UI项目(标签,进度条,图表数据点,bgcolorsbrushes等),它们以每秒1000个数据项更新的速度变化.
在WPF UI上实现批量数据更新的最佳方法是什么?
WPF的绑定模型是否能够进行如此大规模的更新?如果是这样的话?因为我认为在我的情况下它不是最佳的.我正在使用bgworker(for progressbars)并使用DIspatcher BeginInvoke ...但重点是,即使这样,更新也会挂起UI线程,因为调度程序消息排队等待完成.
我不能实现虚拟化,因为状态是实时的,我必须在我面前的UI上看到它们.我甚至不能错过它们几秒钟(例如常数变化的卫星的地理数据).
请帮助我确定一个正确的工具或某种方法来实现复杂但高响应的WPF UI.它是Dispatcher.PushFrame()吗?
由于每秒有如此多的更新,您将在队列中“备份”更新消息,这就是您的后台工作更新被阻止的原因。
要解决此问题,您需要限制抛出的更新事件的数量。
我会使用这样的方法:
在我的 ViewModel 中,将 INotifyPropertyChanged 的正常实现替换为对单例对象的调用,该对象将代表该对象发送通知。
private void OnPropertyChanged(string propertyName)
{
PropertyChangedNotifier.Notify(this, propertyName, propertyChanged);
}
Run Code Online (Sandbox Code Playgroud)
propertyChanged
存储此对象事件处理程序的成员变量在哪里。
该Notify
方法看起来像这样:
public static void Notify(
object sender,
string propertyName,
PropertyChangedEventHandler handlers)
{ ... }
Run Code Online (Sandbox Code Playgroud)
在通知程序中,不要立即发送事件- 只需存储需要发送的事实。
如果您多次收到同一对象/属性的通知,请丢弃多余的通知。如果您多次收到同一对象但不同属性的通知,请将所有属性的通知替换为单个通知。
现在,使用 UX 线程计时器每 50 毫秒左右“释放”一次通知 - 仍然足够快,用户不会注意到任何差异,它看起来像实时更新,但足够慢,可以检测(和删除)重复的通知。
归档时间: |
|
查看次数: |
1670 次 |
最近记录: |