Низкая производительность с ItemsControl / TextBox - PullRequest
0 голосов
/ 05 апреля 2019

У меня проблема с производительностью моего 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. Также я вижу два с половиной этапа на экране, так что половина последнего этапа рендеринга, несмотря на невидимость, не должна быть проблемой.

Спасибо за любую помощь

1 Ответ

0 голосов
/ 05 апреля 2019

Я бы использовал редактируемый DataGrid. Это может быть связано с вашей наблюдаемой коллекцией. Преимущество заключается в том, что текстовое поле создается только при редактировании, в противном случае используется текстовый блок. Вы можете настроить свою сетку так, чтобы она выглядела как ваша картинка. Вы также можете установить ячейку в режим редактирования при нажатии мыши, поэтому для ввода текстового поля (ячейки) требуется всего один щелчок.

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

enter image description here

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