WPF DataGrid的性能问题

我正在测试WPF DataGrid,希望能够取代一些winforms控件,并且到目前为止对开发过程非常满意。 性能似乎是我现在最关心的问题。 我的开发工作站拥有市面上运行Windows 7的最佳CPU,拥有6台DDR3内存。 我正在替换的Windows控件响应速度更快,这令人担忧。

我的测试是绑定到ObservableCollection的DataGrid的基本实现,它每秒更新一次。 它还包括详细信息区域,可以展开以显示有关每行的更多信息。 详细信息区域只是一个stackPanel,其中ItemsControl包装TextBlock(重复6次)

我的抱怨是,如果我尝试滚动此集合,它通常是滞后的,如果我尝试扩展每一行,大约15%的点击不会触发按钮单击事件(DataGridTmplateColumn> CellTemplate> DataTemplate>按钮)如果某些行细节被展开,滚动也会更加抖动(滚动条可以自动resize)

有什么东西可以寻找/优化/避免?

更新

以下是我发现有用的一些要点:

  • 尽可能少地依赖动态布局。 因为每个组件包含许多子组件并且在动态布局世界中,所有组件都必须调用可以是cpu密集型的测量和布局方法。 因此,不使用列宽Auto(或指定宽度),而是使用固定宽度

  • 安装WPF Performance Suite并与您的应用程序呈现方式保持联系。 真棒的应用程序

  • 正如Andrew所指出的那样,ListView是一个很好的选择,因为当你不需要高级DataGridfunction时,例如更新数据,或者可能是Details View(我仍然希望重现)

  • 还有SuspendableObservableCollection非常适合在非常短的时间内添加多个项目(即0.01秒内的100个项目等)

  • 经过大量测试,我发现BindingList比ObservableCollection快得多。 我在这里发布了由BindingList和Observable集合处理的相同负载的性能分析器快照,前者占用的CPU时间不到一半。 (请记住,这不仅仅是集合性能,而是与ListView配对时)

我的搜索仍在继续,因为我的应用程序中的某些内容似乎正在泄漏内存,并在几小时后将其降低到停止状态。

你的意思是来自WPF Toolkit的DataGrid? 如果是,在我看来它很慢,所以我最终使用ListView和GridView。

DataGrid性能问题的一般提示:我在使用DataGrid时出现问题,在窗口resize,列排序等之后刷新了几秒钟,并且在它执行此操作时锁定了窗口UI(1000行,5列) )。

它归结为一个问题(bug?)与WPF大小计算。 我在一个网格中使用了RowDefinition Height =“Auto”,这导致渲染系统通过测量每个列和行的大小来尝试在运行时重新计算DataGrid的大小,可能是通过填充整个网格(据我所知)。 它应该以某种方式智能地处理这个,但在这种情况下它不是。

快速检查以确定这是否是一个相关问题是在测试期间将DataGrid的高度和宽度属性设置为固定大小,然后再次尝试运行。 如果您的性能已恢复,则可以在以下选项中进行永久性修复:

  • 将包含元素的大小更改为相对(*)或固定值
  • 将DataGrid的MaxHeight和MaxWidth设置为大于正常使用时的固定值
  • 尝试另一种具有不同resize策略的容器类型(Grid,DockPanel等)

更一般的提示:

对于滚动,我们所做的是尝试使用延迟滚动。

要提高过滤性能,您可以考虑自己过滤绑定的集合。

对于具有大量列的网格,也应用ColumnVirtualization。 这往往会对水平滚动产生一些不利影响,但您可以测试您的场景并应用改进。 对我们来说,它确实完美无缺。 它帮助我们对大网格的刷新,重新加载,渲染场景。

应用的样式也会影响性能。