调试WPF数据网格虚拟化问题

调试WPF数据网格虚拟化问题,wpf,performance,debugging,datagrid,Wpf,Performance,Debugging,Datagrid,我使用的是WPF datagrid(.Net或Toolkit),当绑定到一个可观察的集合时,速度慢得令人无法接受。它包含大约3500行和10列,显示内容需要一分钟。所有这些都表明了一个事实,即它并没有对数据进行UI虚拟化。然而,我不明白为什么会这样 我没有使用分组。 我已通过将网格放置在具有固定高度的面板中来确保网格的高度得到控制。 我已经在DataGrid上设置了所有虚拟化属性。 我已签入snoop并设置了这些属性。然而,snoop还显示,加载后,可视化树中有数千个datagridrows。我

我使用的是WPF datagrid(.Net或Toolkit),当绑定到一个可观察的集合时,速度慢得令人无法接受。它包含大约3500行和10列,显示内容需要一分钟。所有这些都表明了一个事实,即它并没有对数据进行UI虚拟化。然而,我不明白为什么会这样

我没有使用分组。 我已通过将网格放置在具有固定高度的面板中来确保网格的高度得到控制。 我已经在DataGrid上设置了所有虚拟化属性。 我已签入snoop并设置了这些属性。然而,snoop还显示,加载后,可视化树中有数千个datagridrows。我不知道这是否是使用snoop造成的。 我试着利用这段时间来了解发生了什么。减速似乎不在我们的代码中,而是在系统代码中。然而,我无法找到一种方法来轻松了解WPF在做什么。 我已经剥离了网格,并尝试了.NET4DataGrid和ToolkitDataGrid。两者显示初始数据的速度都慢得令人无法接受。 我尝试过固定行高和列宽。这也没什么区别

我如何确认虚拟化已开启,如果已关闭,为什么会关闭? 如何调试代码之外发生的事情?有没有办法知道WPF在干什么?(我尝试过使用WPF性能套件,但由于某些原因,它没有为我们的应用程序提供任何输出)

我的点子快用完了。当UI中只有10行可见时,速度应该不会这么慢


有人能帮忙吗?

确保
ScrollViewer.CanContentScroll
未设置为
False

有关解释,请参阅


顺便说一句:WPF 4.5介绍了可能对您有所帮助的功能。

在公认的答案中,与WPF 4.5中的虚拟化功能相关的链接已经失效,但这里有一个摘要

如果您使用的是WPF 4.5,您可以通过离开ScrollViewer.CanContentScroll=“true”(即不更改默认设置)并设置
VirtualzingStackPanel.ScrollUnit=“pixel”
来获得基于像素的滚动和虚拟化。例如:

<ListView ItemsSource="{Binding YourItems}"
    ItemTemplate="{StaticResource YourListItemTemplate}"
    VirtualizingStackPanel.ScrollUnit="Pixel"/>


我们看到,渲染200个复杂数据模板实例平均需要4.7秒,该复杂数据模板由文本框、组合框和按钮组成,但通过重新启用
CanContentScroll
并设置
ScrollUnit
,渲染时间缩短到了0.08秒

可能
ScrollViewer.CanContentScroll=false
?看到了,非常感谢!这就是原因。我已经添加了我的评论作为答案,这样这个问题就可以结束了。作者的WPF4.5链接已经失效,但请参阅我的商品答案。