Улучшить производительность прокрутки WPF / telerik (Rad) TreeListView

Я использую телерик RadTreeListView в своем приложении .NET 6 WPF и испытываю очень плохую производительность при прокрутке.

Обновления при использовании колеса прокрутки могут занимать 2 секунды, а быстрое перетаскивание вертикальной полосы прокрутки приводит к скачкам задержки <= 5 секунд.

У меня есть около 350 строк, которые организованы под одним элементом верхнего уровня. Представление имеет 5 столбцов, определенных вручную.

Я профилировал производительность и увидел, что практически все время ЦП, затрачиваемое на поток пользовательского интерфейса, используется для разметки:

Улучшить производительность прокрутки WPF / telerik (Rad) TreeListView

Я попытался включить функцию виртуализации, используя атрибуты EnableRowVirtualization, EnableColumnGroupsVirtualization, EnableColumnVirtualization.

Какие шаги я могу предпринять, чтобы улучшить производительность прокрутки?

Обновлено: вот XAML примера проекта, который иллюстрирует мою проблему.

<telerik:RadBusyIndicator Grid.Column = "1"  Grid.Row = "1"
                                              BusyContent = "{Binding BusyReason}" IsBusy = "{Binding BusyReason, Converter = {StaticResource stringEmptyConverter}}" >
            <telerik:RadTreeListView  x:Name = "treeView" ItemsSource = "{Binding Pages, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" 
                                                 AutoGenerateColumns = "False" AutoExpandItems = "True"
                                                 SelectedItem = "{Binding SelectedPage}"
                                                 PreviewMouseRightButtonDown = "RadTreeListView_PreviewMouseRightButtonDown" IsDragDropEnabled = "False"
                                      PreparedCellForEdit = "treeView_PreparedCellForEdit"
                                      BeginningEdit = "treeView_BeginningEdit"
                                      CanUserDeleteRows = "False"
                                      EnableRowVirtualization = "True"
                                      EnableColumnGroupsVirtualization = "False"
                                      EnableColumnVirtualization = "False"
                                      GroupRenderMode = "Flat"
                                      IsPropertyChangedAggregationEnabled = "False"
                                      >
                <telerik:RadTreeListView.ChildTableDefinitions>
                    <telerik:TreeListViewTableDefinition ItemsSource = "{Binding ChildElements, Mode=TwoWay}"/>
                </telerik:RadTreeListView.ChildTableDefinitions>
                <telerik:RadTreeListView.Columns>
                    <telerik:GridViewDataColumn DataMemberBinding = "{Binding Name, TargetNullValue=''}" Header = "ID Name"
                                                Width = "Auto" IsSortable = "False" IsFilterable = "False"/>
                    <telerik:GridViewComboBoxColumn  Header = "ID" DataMemberBinding = "{Binding Id, Mode=TwoWay}"
                                                IsSortable = "False" IsFilterable = "False"
                                                    ItemsSource = "{Binding RelativeSource = {RelativeSource AncestorType = {x:Type telerik:RadTreeListView}}, Path=DataContext.Ids}"
                                                     Width = "100"
                                                    x:Name = "columnWarnId"
                                                    IsLightweightModeEnabled = "True"
                                                     EmptyText = "not set"
                                                    >
                        <telerik:GridViewComboBoxColumn.EditorStyle>
                            <Style TargetType = "telerik:RadComboBox" BasedOn = "{StaticResource RadComboBoxStyle}">
                                <Setter Property = "OpenDropDownOnFocus" Value = "True"/>
                            </Style>
                        </telerik:GridViewComboBoxColumn.EditorStyle>
                        <telerik:GridViewComboBoxColumn.ItemTemplate>
                            <DataTemplate DataType = "{x:Type dt:DataObject}">
                                <telerik:Label Content = "{Binding IdName}"/>
                            </DataTemplate>
                        </telerik:GridViewComboBoxColumn.ItemTemplate>
                    </telerik:GridViewComboBoxColumn>
                    <telerik:GridViewDataColumn DataMemberBinding = "{Binding Ca, TargetNullValue=''}" Header = "Foobar"
                                                IsFilterable = "False" 
                                                Width = "65"
                                                x:Name = "columnCa"
                                                />
                    <telerik:GridViewDataColumn DataMemberBinding = "{Binding HasChanged, TargetNullValue=''}" Header = "*"
                                                IsFilterable = "False"
                                                IsReadOnly = "True">
                        <telerik:GridViewDataColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Visibility = "{Binding HasChanged, Converter = {helpers:BooleanToVisibilityConverter}}" Text = "*"/>
                            </DataTemplate>
                        </telerik:GridViewDataColumn.CellTemplate>
                    </telerik:GridViewDataColumn>
                    <telerik:GridViewDataColumn DataMemberBinding = "{Binding WarningsPresent, TargetNullValue=''}" Header = "Warning"
                                                IsFilterable = "False"
                                                IsReadOnly = "True">
                        <telerik:GridViewDataColumn.CellTemplate>
                            <DataTemplate>
                                <Image HorizontalAlignment = "Center" Visibility = "{Binding WarningsPresent, Converter = {helpers:BooleanToVisibilityConverter}}"                                    Source = "pack://application:,,,/Resources/Images/icons8-fehler-48.png"
                                       Stretch = "Uniform" 
                                       MaxHeight = "24"/>
                            </DataTemplate>
                        </telerik:GridViewDataColumn.CellTemplate>
                    </telerik:GridViewDataColumn>
                </telerik:RadTreeListView.Columns>
            </telerik:RadTreeListView>
        </telerik:RadBusyIndicator>

Можете ли вы предоставить XAML.. какое свойство вы используете. Каково значение TreeDerivationMode? Также вы можете исследовать свое окно вывода - возможно, будут ошибки привязки.

Anton 20.04.2023 16:46

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

DorP 27.04.2023 07:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поддержка телерика предложила обратную связь.

Проблема с производительностью связана с тем, что в моем случае отображается ~ 200 записей (одинаковые для каждой строки).

Это известная проблема, которая не считается ошибкой Telerik с 2015 года.

Основная причина в том, что базовый GridViewComboBoxColumn оценивает свое содержимое, даже если оно не расширено. Когда я удалил RadComboBox из GridViewComboBoxColumn, производительность подскочила до приемлемого уровня в режиме отладки и хорошей производительности в режиме выпуска.

На странице поддержки, указанной выше, предлагается переписать коллекцию элементов ComboBox в словарь, чтобы улучшить внутреннюю производительность телерика.

Другие вопросы по теме