改善WPF / telerik(Rad)TreeListView不良滚动性能

umuewwlo  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(319)

我用的是telerik RadTreeListView。NET6WPF应用程序和经验非常糟糕的性能在滚动.
使用滚轮进行更新可能需要2秒,快速拖动垂直滚动条会导致滞后峰值〈=5秒。
我有大约350行,它们被组织在一个顶级元素下。该视图有5个手动定义的列。
我分析了性能,发现几乎所有的CPU时间都用于布局:

我尝试使用属性EnableRowVirtualizationEnableColumnGroupsVirtualizationEnableColumnVirtualization来启用虚拟化功能。
我可以采取哪些步骤来提高滚动性能?
编辑:下面是一个示例项目的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>
toiithl6

toiithl61#

telerik支持提供了反馈。
性能问题源于GridViewComboBoxColumn,在我的例子中,它显示了大约200个条目(每行都是相同的)。
这是一个known issue,自2015年以来,telerik就不再认为它是一个bug。
根本原因是底层RadComboBox即使没有扩展也会计算其内容。当我从RadTreeView中删除GridViewComboBoxColumn时,性能在 Debug 模式下跳到可接受的水平,在 Release 模式下跳到良好的性能。
上面链接的支持页面建议将ComboBox项目的集合重写到字典中,以便提高telerik-internal性能。

相关问题