WPF DataGrid的平滑滚动

21 wpf datagrid scroll

我正在使用WPF数据网格,只有我所拥有的修改是:

    <toolkit:DataGridTextColumn.ElementStyle>
       <Style TargetType="TextBlock">
       <Setter Property="TextWrapping" Value="Wrap"/>
      </Style>
    </toolkit:DataGridTextColumn.ElementStyle>
Run Code Online (Sandbox Code Playgroud)

我有这个修改,所以如果单元格内容较长,它们会拉伸行高,不会隐藏任何文本.问题在于DataGrid的滚动行为 - 它在滚动时会跳过整行,如果行高于一行则完全不能正常工作 - 滚动条在滚动时抖动等等.

有没有办法让WPF DataGrid"顺利"滚动而不是逐行滚动?

谢谢

Bry*_*son 31

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

  • 该属性位于ScrollViewer名称空间中:`ScrollViewer.CanContentScroll ="False"` (4认同)
  • 尝试了 2500 行 x 20 列 DataTable 有界 DataGrid 并收到无响应的程序,超过 1GB 内存消耗,几秒钟后我停止等待加载完成。 (2认同)
  • 我建议使用 `VirtualizingPanel.ScrollUnit="Pixel"`,这不会禁用虚拟化。 (2认同)

ero*_*ald 30

我没有明确地使用DataGrid,但事实上使用ScrollViewer.CanContentScroll=False掉掉了ItemsPanelTemplate使用VirtualizedStackPanel带有常规的默认值StackPanel.它将平滑滚动,但即使它不可见,它也将呈现每个项目.

如果您要处理复杂的可视化树或大型数据集,这绝对会破坏性能.

  • 这个答案更精确,因为它警告了禁用ScrollViewer.CanContentScroll和VirtualizedStackPanel的危险. (4认同)

Ble*_*ose 12

用这个:

<DataGrid VirtualizingPanel.ScrollUnit="Pixel">
Run Code Online (Sandbox Code Playgroud)

不要使用CanContentScroll="False". 它禁用虚拟化,当您有很多行时,这可能会导致加载时间过长。虚拟化意味着它只会渲染显示的数据,而不是数据网格的所有数据。

但是,当您没有太多行时禁用虚拟化可能会有所帮助,但每行创建起来很复杂(复杂的数据模板/控件,每行中有大量数据等)。