WPF数据网格的平滑滚动
我正在使用WPF datagrid,唯一的修改是:WPF数据网格的平滑滚动,wpf,datagrid,scroll,Wpf,Datagrid,Scroll,我正在使用WPF datagrid,唯一的修改是: <toolkit:DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="TextWrapping" Value="Wrap"/> </Style> </toolkit:DataGridTextColumn.ElementStyl
<toolkit:DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap"/>
</Style>
</toolkit:DataGridTextColumn.ElementStyle>
我有这个修改,所以如果单元格内容较长,它们会拉伸行高度,不会隐藏任何文本。
问题在于DataGrid的滚动行为——滚动时它会跳过整行,如果行高于一行,则根本无法正常工作——滚动条在滚动时会抖动等等
有没有办法让WPF数据网格“平滑”地滚动,而不是逐行滚动
感谢数据网格
有一个附加属性ScrollViewer.CanContentScroll
,用于管理此行为。要获得平滑的滚动,您需要将其设置为False
我没有明确地使用DataGrid,但事实上,使用ScrollViewer.CanContentScroll=False
可以替换默认的ItemsPanelTemplate
,它使用VirtualizedStackPanel
和常规的StackPanel
。它将平滑滚动,但它将渲染每个项目,即使它不可见
如果您处理的是复杂的可视化树或大型数据集,这绝对会降低性能。
<DataGrid Grid.Row="1"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserReorderColumns="False"
CanUserSortColumns="False"
SelectionUnit="FullRow"
HeadersVisibility="None"
Name="grd"
GridLinesVisibility="None"
ItemsSource="{Binding}"
AutoGenerateColumns="False"
ScrollViewer.CanContentScroll="False">
</DataGrid>
使用以下方法:
<DataGrid VirtualizingPanel.ScrollUnit="Pixel">
不要使用CanContentScroll=“False”
。它会禁用虚拟化,当您有很多行时,这会导致加载时间过长。虚拟化意味着它将只呈现所显示的数据,而不是datagrid的所有数据
但是,当您没有太多行,但每行的创建都很复杂(每行中有复杂的数据模板/控件、大量数据等)时,禁用虚拟化可能会有所帮助。该属性位于ScrollViewer命名空间中:ScrollViewer.CanContentScroll=“False”
尝试了2500行x 20列的数据表绑定数据网格,收到了无响应的程序,内存消耗超过1GB,几秒钟后我停止等待加载完成。@JānisGruzis这是另一个问题。这是指datagrid一次滚动一行,而不是平滑滚动。对于您正在讨论的问题,听起来好像您在ScrollViewer或面板中显示了整个网格,并且您正在滚动,因此整个网格显示的是DataGrid内容。你需要使用网格的内部滚动查看器。太棒了!对于那些需要编程的人。。。dataGrid1.SetValue(ScrollViewer.CanContentScrollProperty,false);我建议使用virtualizangpanel.ScrollUnit=“Pixel”
,这不会禁用虚拟化。这个答案更准确,因为它警告禁用ScrollViewer.CanContentScroll和VirtualizedStackPanel的危险。@Ralms它是一个附加属性。我从未尝试过,但谷歌的快速搜索显示,附加属性可以这样设置。当您的Datagrid命名为这样的
时,您可以像这样设置附加属性VirtualizingPanel.SetScrollUnit(MyDataGrid,ScrollUnit.Pixel)代码>是,正在使用XAML。在我的例子中,很多UI都是通过.cs文件上的代码生成的,我只是创建了生成器函数来反复添加相同的元素。因此,在本例中,我正在执行正常的“var myDG=new DataGrid()”,我不知道如何访问这些附加属性。有什么想法吗?@Ralms应该是同样的过程。只需使用myDG作为名称VirtualizingPanel.SetScrollUnit(myDG,ScrollUnit.Pixel);非常感谢你,工作很有魅力。不知道“附加属性”的方式。VirtualizingPanel.ScrollUnit=“Pixel”对平滑滚动没有任何帮助。