我有一个应用程序需要显示一个主要由布尔值组成的数据网格,并且复选框列符合该帐单。将有大约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中的滚动问题,我尝试了以下所有组合:
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();
仅改善垂直滚动false
有一个错误,它会回收一个被检查的Recycling
控件并将其放在一个应该取消选中的新行中,导致淡出动画。这使得复选框看起来具有“重影”效果。 我愿意接受低于标准的表现。我不希望WinForms的平滑性(WPF毕竟给了我更多,尽管这应该被WPF的GPU加速所抵消)。我只想要一些可用的东西,即使只是几乎无法使用。
答案 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性能很差)。