2011-07-17 2 views
5

У меня очень сложный интерфейс с постоянно меняющейся строкой состояния с несколькими типами сообщений о состоянии и пользовательским интерфейсом, имеющим сложный контроль диаграммы и загружаемую ориентировочную географическую карту.Массовые обновления в сложном интерфейсе

Теперь контекст данных этих небольших, но сложных областей имеет одинаково сложные ViewModels, такие как StatusBarVM, ChartingVM, GeoMapVM и т. Д. Они реализуют INotifyPropertyChanged и ObservableCollections.

Расчет моих обновлений Я вижу, что у меня около 5000 элементов пользовательского интерфейса (lables, progressbars, points data points, bgcolorsbrushes и т. Д.), Которые меняются с быстрой скоростью 1000 обновлений элементов данных в секунду.

Каков наилучший способ добиться этого массового обновления данных в интерфейсе WPF?

Является ли модель привязки WPF способной к таким огромным обновлениям? Если да, то как? Потому что я вижу, что это не оптимально в моем случае. Я также использую bgworker (для progressbars) и используя DIspatcher BeginInvoke ... но дело в том, что даже тогда обновления зависают в потоке пользовательского интерфейса, поскольку сообщения диспетчера становятся в очереди, ожидая завершения.

Я не могу реализовать виртуализацию, так как статусы в реальном времени, и я должен видеть их все в интерфейсе пользователя передо мной .. Я не могу позволить себе пропустить их даже на пару секунд (например, географические данные, ,

Пожалуйста, помогите мне определить правильный инструмент или каким-то образом достичь сложного, но высокочувствительного интерфейса WPF. Это Dispatcher.PushFrame()?

ответ

4

С таким количеством обновлений в секунду вы будете получать сообщения об обновлении в резервной копии, поэтому ваши обновления рабочего стола блокируются.

Чтобы решить эту проблему, вам необходимо активировать количество обновляемых событий обновления.

Я хотел бы использовать такой подход, как это:

В моем ViewModels заменить нормальную реализацию 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 мс или около того - все еще достаточно быстро, чтобы пользователь не заметил никакой разницы, и он выглядит как обновления в реальном времени, но достаточно медленный, чтобы обнаруживать (и удалять) дублировать уведомления.

+0

Это похоже на хорошую реализацию, хотя я должен спросить об обновлениях на основе буферов (для других технологий пользовательского интерфейса, таких как ASP.NET, WinForms и т. Д.), То же самое, что вы обсуждали здесь? –

+1

Я не уверен, термин «обновления на основе буферизированных пользовательских интерфейсов» не является тем, который я признаю. – Bevan

+1

Вы должны использовать эту фреймворк для пакетной загрузки обновлений: [Reactive Extensions] (https://rx.codeplex.com/), см. Буфер детали со временем. – Thomas

Смежные вопросы