2012-07-07 173 views
0

我正在使用WPF数据网格(.Net或Toolkit),绑定到可观察集合时速度慢得无法接受。它包含大约3500行和10列,并花费一分钟时间来显示内容。所有事情都指出了这样一个事实,即它没有对数据进行UI虚拟化。但是,我不明白为什么会这样。我不使用分组。我不使用分组。 我已经确定网格的高度包含在一个固定高度的面板中。 我已经在DataGrid上设置了所有虚拟化属性。 我已经在snoop中进行了检查并设置了这些属性。但是,snoop还显示加载之后,可视树中有数千个数据列。这是否是使用snoop引起的事情,我不知道。 我尝试过使用AQTime来了解发生了什么。减速似乎不在我们的代码中,而是在系统代码中。但是,我找不到一种轻松查看WPF是否合适的方法。 我已经剥离了网格并尝试了.Net 4 DataGrid和工具包DataGrid。显示最初数据的速度都非常缓慢。 我曾尝试修复行高和列宽。这也没有区别。调试WPF DataGrid虚拟化问题

我该如何确认虚拟化是否开启以及是否关闭它为什么关闭? 如何调试我们的代码之外发生的事情?有什么方法可以看到WPF是什么? (我尝试过使用WPF性能套件,但出于某种原因,它不会为我们的应用程序提供任何输出)。

我正在用尽想法。当UI中只有10行可见时,它不应该这么慢。

任何人都可以帮忙吗?

+0

也许'ScrollViewer.CanContentScroll = false'?请参阅[为什么将ScrollViewer.CanContentScroll设置为false禁用虚拟化](http://stackoverflow.com/q/3724593/620360)。 – LPL 2012-07-07 17:28:01

+0

非常感谢!这是原因。 – 2012-07-09 07:57:41

+0

我已将我的评论添加为答案,以便可以关闭此问题。 – LPL 2012-07-09 09:13:21

回答

0

有关WPF 4.5中虚拟化功能的接受答案中的链接已经死了,但这里有一个总结。

如果您使用的是WPF 4.5,您可以通过将ScrollViewer.CanContentScroll="true"(即不从默认值更改)和设置VirtualizingStackPanel.ScrollUnit="Pixel"来获得基于像素的滚动和虚拟化。例如:

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

我们看到4.7秒的平均呈现由文本框,组合框和按钮,一个复杂的DataTemplate中的200个实例,但通过重新启用CanContentScroll和设置ScrollUnit代替了渲染时间下降到0.08秒。