在WPF4 DataGrid中水平滚动时性能不佳

时间:2012-09-01 17:53:18

标签: c# .net wpf wpfdatagrid

我有一个应用程序需要显示一个主要由布尔值组成的数据网格,并且复选框列符合该帐单。将有大约40-60个复选框列,大约200行。我认为在WPF中做类似的事情是微不足道的。

我甚至无法接近WPF的水平滚动体验。要查看我正在谈论的内容,请创建Window并在其上放置DataGrid,然后设置AutoGenerateColumns="True",然后在InitializeComponent();之后在构造函数中添加以下内容:< / p>

dataGrid1.ItemsSource = Create(200, i => new { b1 = true, b2 = false, b3 = true, b4 = false, b5 = true, b6 = false, b7 = true, b8 = false, b9 = true,
                                               b10 = false, b11 = true, b12 = false, b13 = true, b14 = false, b15 = true, b16 = false, b17 = true, b18 = false, b19 = true, b20 = false, b21 = true,
                                               b22 = false, b23 = true, b24 = false, b25 = true, b26 = false, b27 = true, b28 = false, b29 = true, b30 = false, b31 = true, b32 = false });

它需要这种方法,也可以添加它:

ObservableCollection<T> Create<T>(int count, Func<int, T> creator)
{
    return new ObservableCollection<T>(Enumerable.Range(0, count).Select(creator));
}

运行应用程序,并尝试水平滚动。太可怕了,不是吗?垂直滚动也不会太热。

我在WinForms应用程序中做了同样的事情,并且在所有方向上滚动都非常平滑,并且在将DataGridView的{​​{1}}属性强制为DoubleBuffered之后看起来和WPF一样好。要进行比较,请创建新的true,选择Form并在DataGridView之后将以下内容添加到构造函数中:

InitializeComponent();

这个列的数量是列的两倍,行数的两倍,并且它在水平和垂直方向上滚动都像新生儿的底部一样平滑。

但不幸的是,我不能用WinForms做我需要的东西。我需要模板化的列。我需要可组合性。

为了解决WPF中的滚动问题,我尝试了以下所有组合:

  • EnableColumnVirtualization(true / false)
  • EnableRowVirtualization(true / false)
  • ScrollViewer.CanContentScroll(true / false) - typeof(DataGridView).GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(dataGridView1, true, null); for (int i = 0; i < 64; i++) dataGridView1.Columns.Add(new DataGridViewCheckBoxColumn {HeaderText = "C" + i, Width = 30}); for (int i = 0; i < 400; i++) dataGridView1.Rows.Add(); 仅改善垂直滚动
  • 固定大小的列
  • 固定大小的数据网格
  • VirtualizingStackPanel.VirtualizationMode(Recycling / Standard) - false有一个错误,它会回收一个被检查的Recycling控件并将其放在一个应该取消选中的新行中,导致淡出动画。这使得复选框看起来具有“重影”效果。
  • ScrollViewer.IsDeferredScrollingEnabled - 对不起,我不能接受降级为Windows 3.1风格的滚动,因为这些内容非常简单。

我愿意接受低于标准的表现。我不希望WinForms的平滑性(WPF毕竟给了我更多,尽管这应该被WPF的GPU加速所抵消)。我只想要一些可用的东西,即使只是几乎无法使用。

2 个答案:

答案 0 :(得分:1)

这主要是因为CheckBox可视化树非常复杂。如果你重新设计可视树,你可以获得更好的性能。

虽然ControlTemplate(单边框)中只有单个元素,但没有延迟或延迟。 您可以从这里获得具体的风格: http://msdn.microsoft.com/en-us/library/ms752319%28v=vs.85%29.aspx

肯定会花一些时间在数据绑定上。看到这个: Databinding optimization,它解释了对通常财产的约束需要更长时间。通常因为它涉及反射。使用依赖项属性时,不涉及反射。据我所知。

你的班级肯定不大,但你确定可以考试。如果一切都是依赖属性,它会表现得更好吗?

如果您遇到任何问题,请告诉我。

答案 1 :(得分:1)

如我的评论所述,我不确定这个问题。如果您正在寻找WPF中网格的性能,那么请转到ListView / GridView。除非你必须拥有DataGrid的某些功能。这是更多的代码,但值得。我有一个包含40列和1000行的GridView,性能良好(而且DataGrid性能很差)。