改进WPF DataGrid的滚动性能

时间:2013-03-12 11:35:30

标签: wpf performance datagrid

这是一个简单的DataGrid基准:

open System.Windows

let mutable i = 0
let timer = System.Diagnostics.Stopwatch.StartNew()

[<System.STAThreadAttribute>]
do
  let grid = Controls.DataGrid()
  grid.AutoGenerateColumns <- false
  for i in 1..50 do
    let c = Controls.DataGridTextColumn()
    c.Binding <- Data.Binding()
    c.Header <- string i
    grid.Columns.Add c
  grid.ItemsSource <- Array.init 1000 string
  let window = Window(Content=grid)
  window.WindowState <- WindowState.Maximized
  Media.CompositionTarget.Rendering.Add(fun _ ->
    i <- i + 38
    grid.ScrollIntoView grid.Items.[i % 1000]
    window.Title <- sprintf "%gfps" (float i / timer.Elapsed.TotalSeconds / 38.0)
    if i > 10000 then
      i <- 1
      timer.Restart())
  Application().Run window
  |> ignore

我的性能很差(4x 3.4GHz Intel Core i7上6帧/秒)。如何优化?

我在网上找到了一些建议,但没有一个有任何显着差异:

  grid.EnableColumnVirtualization <- true
  grid.EnableRowVirtualization <- true
  grid.ColumnWidth <- Controls.DataGridLength 27.0
  grid.RowHeight <- 18.0
  ...
    if i=0 then
      let border = Media.VisualTreeHelper.GetChild(grid, 0) :?> Controls.Border
      let scroll = border.Child :?> Controls.ScrollViewer
      scroll.IsDeferredScrollingEnabled <- true

1 个答案:

答案 0 :(得分:1)

我确定你已经考虑过了,但是你确定你没有使用调试器,因为关闭它可以显着提高性能

修改

好的,为什么不尝试使用调度计时器。这可以在一个单独的线程上运行,从而在理论上提高性能