WPF Toolkit DataGrid滚动性能问题 - 为什么?

and*_*dyp 24 c# wpf performance datagrid

我在(WPF Toolkit)DataGrid中遇到了性能问题.它包含大约1.000行(只有8列),滚动速度非常慢且滞后.此外,包含DataGrid的Window的初始加载需要5-10秒.

我做了一些研究(使用谷歌和StackOverflow)但除了打开UI虚拟化的建议之外找不到任何东西.但即使在明确表示滚动仍然非常缓慢之后.

我的DataGrid绑定到ICollectionView/CollectionViewSource.它是在XAML中定义的(列是明确定义的,不是自动生成的):

    <tk:DataGrid x:Name="dataGrid" 
                 ItemsSource="{Binding Path=Bookings}" 
                 AutoGenerateColumns="False" 
                 Grid.Row="1" 
                 EnableRowVirtualization="True" 
                 EnableColumnVirtualization="True"
                 VirtualizingStackPanel.IsVirtualizing="True"
                 VirtualizingStackPanel.VirtualizationMode="Recycling">
            ... 
    </tk:DataGrid>
Run Code Online (Sandbox Code Playgroud)

整个Window的DataContext设置为包含DataGrid绑定的ICollectionView的类的实例.

我发现的每篇博客或论坛帖子都赞扬了DataGrid的表现,所以我显然做了一些严重的错误.由于我对WPF很新,特别是对于DataGrid,我不知道如何改进它.有人对我有什么建议吗?您对DataGrid的体验如何?我究竟做错了什么?

编辑:只需按照问题的建议将所有列的宽度设置为"自动".这并没有改变糟糕的滚动性能.另外,我没有使用DataGridTemplateColumns(只是一些DataGridTextColumns和两个DataGridComboBoxColumns).

Edit2:我用Snoop查看我的应用程序.我所看到的表明虚拟化确实在起作用(只有19行,而不是一千行).但每行包含52个元素,因此这些元素总计超过千个元素.可能是一个问题?

非常感谢!

小智 18

DataGrid有一个Attached属性ScrollViewer.CanContentScroll,用于管理此行为.要获得平滑滚动,您需要将其设置为False.

  • 但是,如果将ScrollViewer.CanContentScroll设置为false,则会关闭虚拟化。这就是滚动速度更快的原因:如果关闭了虚拟化,则无需即时创建项目。 (3认同)
  • 看起来加载时间比以前更长。您知道如何平衡两者吗? (2认同)
  • 此“解决方案”关闭虚拟化(所有项目加载 -&gt; 加载时间更长),并且如果计算机功能强大到足以处理加载项目量的渲染,则允许平滑滚动。对于有大量物品的情况,这不是一个解决方案。 (2认同)

and*_*dyp 6

在最后花时间针对WPF的最新版本构建我的应用程序之后,滚动问题似乎完全消失了.因此,如果有人仍然使用DataGrid的工具包版本只是"更新"到框架中包含的版本,你应该没问题.