Я тестирую WPF DataGrid в надежде заменить некоторые элементы управления winforms, и до сих пор был очень доволен процессом разработки. Производительность, кажется, моя самая большая проблема прямо сейчас. Моя рабочая станция для разработки имеет почти лучший процессор на рынке под управлением Windows 7 с 6 гигабайтами памяти DDR3. Элемент управления windows, который я заменяю, значительно более отзывчив, что вызывает беспокойство.
Мой тест - это базовая реализация DataGrid, привязанная к ObservableCollection, которая обновляется раз в секунду. Он также включает в себя область сведений, которая расширяется, чтобы показать больше информации о каждой строке. Область сведений - это просто панель стека с TextBlock-оберткой ItemsControl (которая повторяется 6 раз)
Моя жалоба состоит в том, что если я пытаюсь прокрутить эту коллекцию, она часто дергается с задержкой, и если я пытаюсь развернуть каждую строку по мере их поступления, около 15% нажатий не вызывают событие нажатия кнопки (DataGridTmplateColumn> CellTemplate > DataTemplate> Button)
Кроме того, прокрутка более нервная, если развернута деталь ряда строк (с полосой прокрутки, которая самостоятельно изменяет размер при перемещении вверх / вниз)
что нужно искать / оптимизировать / избегать?
обновление
Вот некоторые моменты, которые я нашел полезными:
полагаться как можно меньше на динамическое расположение. так как каждый компонент содержит много подкомпонентов и в мире динамического макета, все они должны вызывать методы Measure и Layout, которые могут потреблять много ресурсов процессора. поэтому вместо ширины столбца Авто (или без указания ширины) используйте фиксированную ширину
установите WPF Performance Suite и узнайте, как отображается ваше приложение. потрясающе крутое приложение
, как отметил Эндрю, ListView - отличная альтернатива, когда вам не нужны расширенные функции DataGrid, такие как обновление данных или, возможно, представление сведений (которое я все еще надеюсь воспроизвести)
также SuspendableObservableCollection идеально подходит для добавления нескольких элементов за очень короткий промежуток времени (т. Е. 100 элементов за 0,01 секунды и т. Д.)
после многих испытаний я обнаружил, что BindingList намного быстрее, чем ObservableCollection. Я разместил снимки профилировщика производительности здесь той же нагрузки, которая обрабатывается коллекцией BindingList vs Observable, а первая занимает меньше половины процессорного времени. (имейте в виду, что это не только производительность коллекции, но и в сочетании с ListView)
мой поиск все еще продолжается, поскольку в моем приложении происходит утечка памяти, и через пару часов он останавливается.