Проблемы производительности WPF DataGrid - PullRequest
13 голосов
/ 11 июня 2010

Я тестирую 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)

мой поиск все еще продолжается, поскольку в моем приложении происходит утечка памяти, и через пару часов он останавливается.

Ответы [ 3 ]

2 голосов
/ 14 сентября 2011

Общий совет по проблемам производительности DataGrid: у меня была проблема с DataGrid, в которой потребовалось буквально несколько секунд для обновления после изменения размера окна, сортировки столбца и т. Д., И он заблокировал интерфейс окна во время этого (1000 строк, 5 столбцов).

Это привело к проблеме (ошибка?) С расчетами размеров WPF.У меня было это в сетке с RowDefinition Height = "Auto", которая заставляла систему рендеринга пытаться пересчитать размер DataGrid во время выполнения, измеряя размер каждого столбца и строки, предположительно, заполняя всю сетку (как я понимаю).Предполагается, что это нужно как-то разумно обрабатывать, но в этом случае это не так.

Быстрая проверка, чтобы выяснить, не является ли это связанной проблемой, состоит в том, чтобы установить для свойств Высота и Ширина DataGrid фиксированный размерПродолжительность теста и попробуйте запустить снова.Если ваша производительность восстановлена, постоянное исправление может быть одним из следующих вариантов:

  • Изменить размеры содержащихся элементов на относительные (*) или фиксированные значения
  • Установить MaxHeight и MaxWidthDataGrid с фиксированным значением, превышающим обычное значение
  • Попробуйте использовать другой тип контейнера с другой стратегией изменения размера (Grid, DockPanel и т. д.)
1 голос
/ 03 ноября 2012

Более общие советы:

Для прокрутки мы попытались использовать отложенную прокрутку.

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

Для сеток с большим количеством столбцов примените также ColumnVirtualization.Это, как правило, несколько отрицательно влияет на горизонтальную прокрутку, но вы можете проверить свой сценарий и применить улучшения.Для нас это сработало идеально.Это помогло нам в сценариях Refresh, Reload, Render для больших сеток.

На производительность также влияет применяемый стиль.

1 голос
/ 11 июня 2010

Вы имеете в виду DataGrid из WPF Toolkit? Если да, то, на мой взгляд, это довольно медленно, поэтому я в итоге использовал ListView с GridView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...