Я тестирую WPF DataGrid в надежде заменить некоторые элементы управления winforms, и до сих пор был очень доволен процессом разработки. Производительность, похоже, сейчас самая большая проблема. Моя рабочая станция разработки имеет почти лучшие процессоры на рынке, работающие под управлением Windows 7, с 6 гигабайтами памяти DDR3. Управление окнами, которые я заменяю, значительно более чувствительно, что вызывает беспокойство.
Мой тест - это базовая реализация DataGrid, привязанная к ObservableCollection, которая обновляется один раз в секунду. Он также включает в себя область сведений, которая расширяема, чтобы показать больше информации о каждой строке. Зона сведений - это только панель стека с помощью TextClock для ItemsControl (которая повторяется 6 раз)
Моя жалоба заключается в том, что, если я пытаюсь прокрутить эту коллекцию, она часто дергается с задержкой, и если я пытаюсь расширить каждую строку по мере ее поступления, около 15% кликов не запускают кнопки click event (DataGridTmplateColumn > CellTemplate > Кнопка DataTemplate > ) Кроме того, прокрутка более неустойчива, если детали некоторых строк расширены (с полосой прокрутки, которая сама по себе изменяет ее размеры по мере продвижения вверх/вниз).
какие вещи искать/оптимизировать/избегать?
Обновление
вот несколько моментов, которые я нашел полезными до сих пор:
-
полагайтесь как можно меньше на динамическую компоновку. поскольку каждый компонент содержит много подкомпонентов и в мире динамической компоновки, все они должны вызывать методы измерения и макета, которые могут быть интенсивными. поэтому вместо ширины столбца Auto (или без указанной ширины) используйте фиксированную ширину
-
установите WPF Performance Suite и свяжитесь с тем, как ваше приложение отображается. trully awesome app
-
как указал Андрей, ListView - отличная альтернатива, поскольку вам не нужны расширенные функции DataGrid, такие как обновление данных или возможно просмотр деталей (которые я все еще надеюсь воспроизвести)
-
также SuspendableObservableCollection идеально подходит, когда вы добавляете несколько элементов за очень короткий промежуток времени (т.е. 100 пунктов в 0,01 секунды и т.д.)
-
после множества тестов я обнаружил, что BindingList намного быстрее, чем ObservableCollection. Я опубликовал снимки профайлера профилей здесь той же нагрузки, которую обрабатывает коллекция BindingList vs Observable, а первая занимает менее половины процессорного времени. (имейте в виду, что это не только производительность коллекции, но и в сочетании с ListView)
мой поиск по-прежнему продолжается, поскольку что-то кажется утечкой памяти в моем приложении и замедляет ее до остановки через пару часов.