У меня проблема с производительностью моего wpf-приложения. Я показываю форму со многими текстовыми полями (например, 130 или около того). Это программное обеспечение, в котором пользователь может настроить много состояний в три этапа машины дистиллятора. Форма состоит из трех разделов (этапов), каждый из которых может иметь различное количество состояний и фиксированное количество свойств для настройки. Каждое состояние дает пользователю возможность установить 6 значений (через текстовое поле).
Таким образом, если этап состоит, например, из 7 состояний, он имеет 7x6 + 5 (фиксированная сумма) = 47 текстовых полей. Таким образом, 3 этапа могут отображать 141 текстовое поле (это будет меньше, потому что только два этапа могут быть видимы, остальные можно прокрутить вниз).
https://pasteboard.co/I8LiVxG.png
Для отображения состояний для каждого этапа я использую ItemsControl с привязкой ObservableCollection. Это узкое место в профилировщике производительности VS, поскольку приложение тратит слишком много времени на макет (оранжевый цвет).
Когда я меняю ItemsControl со StackPanel и фиксированным количеством состояний, проблема исчезла.
https://pasteboard.co/I8Lhu37.png
Конечно, пользовательский интерфейс немного сложнее, есть список с процессами дистиллятора, и каждый процесс отображается подробно с этапами и состояниями. У меня также есть viewmodels и bindings, количество состояний может быть изменено во время выполнения, поэтому существует ObservableCollection, привязанная к ItemsControl. Ничто из этого не вызывает проблемы, я попытался отключить большую часть кода mvvm, который сбрасывает значения или воссоздает коллекцию состояний.
<ItemsControl Grid.Row="2" ItemsSource="{Binding Cuts}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:RunConfigControl DataContext="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
В приведенном выше коде RunConfigControl представляет собой просто сетку с 6 текстовыми полями и метками. Cuts - это название ObservableCollection.
В чем разница, когда я использую фиксированное количество элементов управления в StackPanel и когда использую ItemsControl с коллекцией. Существует также StackPanel, когда я смотрю на визуальное дерево.
Также я знаю, что элементы управления визуализируются, когда они не видны (я не использую виртуализацию), но не так много состояний (между 2-10) и количество стадий всегда равно 3. Также должны быть видны все состояния Мне не нужно показывать 3 состояния и прокручивать еще 7. Также я вижу два с половиной этапа на экране, так что половина последнего этапа рендеринга, несмотря на невидимость, не должна быть проблемой.
Спасибо за любую помощь