WPF DataGrid虚拟化功能无法正常工作?

5
我有一个DataGrid,其中设置了一个DataTable作为其ItemsSource。该DataTable拥有24列和约1600行(实际上我稍后将需要加载更多的行数,但目前这已经够麻烦的了)。
尽管启用了列和行的虚拟化,但DataGrid仍需要大约30秒才能显示这些1600行。之后,垂直滚动工作正常,水平滚动则有些卡顿,尽管你期望的情况应该是相反的。
如果我运行内存分析器,我可以验证应用程序使用的大部分内存来自DataGridCells、Borders、ContentPresenters和Textblocks。对我来说,这表明该网格没有正确地虚拟化其行。
有人可以确认DataGrid的虚拟化存在问题吗?或者这个控件的实现中是否存在某种臭名昭著的陷阱?
期待任何形式的输入/建议。谢谢 :)

所有列都是标准列,即只包含文本,还是有一些包含像“复选框”等控件的列? - DHN
不,其中两个是复选框。 - i know nothing
嗯,那就试试把这两列删除或将它们的外观改为“标准”吧。 - DHN
1
很遗憾,没有任何改变。 - i know nothing
2个回答

6
我已经解决了这个问题。 我的DataGrid坐落在一个ScrollViewer中,它会无限地拉伸。所以它被欺骗以为所有东西都是可见的,这就是为什么它不会虚拟化其项目。 我移除了ScrollViewer(DataGrid自己有滚动条),现在它完美地工作了。

2

嗯,好的,我不知道为什么,但显然我必须添加一些胶水文本才能在这里发布答案。也许,这个SO答案会对你有所帮助。

编辑

作为额外的建议,我想建议您考虑自己的方法。是否真的需要向DataGrid添加1600多个项目?也许您应该考虑延迟加载。


1
是的,我已经考虑过这个问题。奇怪的是,Winforms DataGrid 似乎可以正常工作。 - i know nothing
复选框似乎不是问题所在。删除这些列并没有起作用。 - i know nothing
1
是的,那确实有帮助。但这对我没用,我希望用户能够立即滚动几百行。 - i know nothing
1
由于网格将显示从许多来源以100hz收集的数据(来源是加速度计和CAN总线),因此我不能使用少量行。当然,我可以强制用户在显示结果之前过滤结果,但最终仍将有数千行。 - i know nothing
我想你是对的,我可以尝试对样本进行分组。现在我会试着绕过这个问题。谢谢你的帮助,DHN。 - i know nothing
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接