我用的是telerik RadTreeListView
。NET6WPF应用程序和经验非常糟糕的性能在滚动.
使用滚轮进行更新可能需要2秒,快速拖动垂直滚动条会导致滞后峰值〈=5秒。
我有大约350行,它们被组织在一个顶级元素下。该视图有5个手动定义的列。
我分析了性能,发现几乎所有的CPU时间都用于布局:
我尝试使用属性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>
1条答案
按热度按时间toiithl61#
telerik支持提供了反馈。
性能问题源于
GridViewComboBoxColumn
,在我的例子中,它显示了大约200个条目(每行都是相同的)。这是一个known issue,自2015年以来,telerik就不再认为它是一个bug。
根本原因是底层
RadComboBox
即使没有扩展也会计算其内容。当我从RadTreeView
中删除GridViewComboBoxColumn
时,性能在 Debug 模式下跳到可接受的水平,在 Release 模式下跳到良好的性能。上面链接的支持页面建议将ComboBox项目的集合重写到字典中,以便提高telerik-internal性能。