Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF数据网格的平滑滚动_Wpf_Datagrid_Scroll - Fatal编程技术网

WPF数据网格的平滑滚动

WPF数据网格的平滑滚动,wpf,datagrid,scroll,Wpf,Datagrid,Scroll,我正在使用WPF datagrid,唯一的修改是: <toolkit:DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="TextWrapping" Value="Wrap"/> </Style> </toolkit:DataGridTextColumn.ElementStyl

我正在使用WPF datagrid,唯一的修改是:

    <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”对平滑滚动没有任何帮助。