当装载大量数据时(40列,2000行),WPF网格滚动缓慢且卡顿。

5
简而言之,当使用大量纯数据加载WPF网格/项控件时,我们无法获得合理的滚动性能。
我们使用DevExpress WPF网格创建了一个静态独立原型,并在此处上传:

http://jump.fm/QOTDL

我们也尝试过使用Infragistics和Xceed网格,但问题仍然存在。
似乎WPF无法处理显示大量数据的相对较大数据网格以提供流畅的用户体验。即使没有任何类型的数据绑定,仅提供静态数据(~40列宽,2000行),滚动也会变得缓慢。在最低级别上,分析器似乎表明“Measure”发生过多,除了大量的垃圾收集外,这可能是不规则卡顿的原因。
原型中的代码可以轻松替换为其他网格。如果有人能够在给定场景中产生平滑的滚动体验,特别是在数据被分组到多个级别且密集包装的情况下,请告诉我们,我们非常感兴趣。
额外的细节:
我们创建了2000个对象(每个对象有~40个属性),并将它们分配给网格的数据源属性。
我们的每个对象都表示为类似以下内容的类:
public class RowViewModel
{
    public double AskAsw { get; set; }
    public string AskBmkName { get; set; }
    public double AskBmkPrice { get; set; }
    public double AskBmkSprd { get; set; }
    ... and so on
}

这些代码可以这样创建并添加到一个集合/列表中:
        for (int i = 1; i < 2000; i++)
        {
            _rowViewModels.Add(new RowViewModel(i));
        }

然后绑定到数据网格。非常简单:

        gridControl.DataSource = _rowViewModels;

这将导致一个数据网格显示此信息。我们将字体缩小(10px,按用户要求),并自动调整大小和分组列。结果看起来类似于这样:

http://i54.tinypic.com/21jt11t.png

滚动非常卡顿/缓慢。如果您有任何想法,请告知我们。

你是如何填充网格的?使用数据绑定还是手动方式?它是什么类型的数据源?请提供更多细节,因为我怀疑任何人都不会下载项目文件... - Thomas Levesque
如果可以的话,你能否指定这些网格中的数据面板?如果可以的话,你需要考虑使用VirtualizingStackPanel。它专门设计用来处理大型数据集,通过延迟创建UI元素直到需要时处理。 - benPearce
@Thomas - 感谢您的建议,我已在帖子末尾添加了更多细节。 - Gaurav Sharma
@benPearce,无论是DevExpress、Infragistics还是Xceed的网格控件,都比较难以设置这些属性,即网格控件的开发者已经实现并优化了虚拟化等功能。具体来说,DevExpress没有关闭垂直虚拟化的选项(即默认开启)。有趣的是,您可以关闭水平虚拟化,这似乎可以使侧向滚动更快,因为它可能已经以每行的方式计算了可视化树 - 看起来on-the-fly渲染似乎是瓶颈。 - Gaurav Sharma
刚试了一下你的上传,但用 Xceed 替换了网格。对我来说似乎正常工作。没有改变自适应调整大小、按注释分组或展开所有的实现方式。分组是本地支持的,似乎运行良好。不,我不是在 Xceed 工作,只是我们在应用程序中使用它。 - krishna
1个回答

4

随附于.NET 4.0的数据网格在处理超过此数量时仍能正常工作。已测试200列和50K行(包括int32、double、字符串和自定义类显示的混合)。

有一些标志可以打开行和列虚拟化功能。但请记住,如果您进行分组操作,这将取消行虚拟化功能。

我通过使用自己的钻取 - 两个表格 - 用户控件来获取分组功能,虽然不是很好,但足以满足我的需求。


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