WPF数据网格和动态列宽

时间:2012-09-14 16:48:45

标签: .net wpf datagrid resize

我们有一个自定义DataGrid控件,可以动态生成由XML结构确定的列。

创建每个列时,我们给它一个星号单位类型,因为我们要确保在DataGrid中永远不会有任何水平滚动。

            DataGridTextColumn column = new DataGridTextColumn();
            column.Width = new DataGridLength(entity.DisplaySize, DataGridLengthUnitType.Star);

但是,我们注意到,当渲染DataGrid时,它会以给定列的最小大小呈现,然后一旦完全呈现DataGrid,它就会调整列的大小以适合DataGrid。这会导致闪烁效应。

有没有人有任何可能的解决方案?也许如何在后台呈现DataGrid,然后在列完成后显示?还是其他任何想法?

1 个答案:

答案 0 :(得分:3)

不幸的是,这是正常行为。它与控件的呈现方式有关。在WPF中,您在控件层上有图层,而DataGrid在完成渲染之前无法知道控件的类型。

因此,第一个布局过程创建控件,但是它必须经过第二次传递来测量这些控件的大小。一旦它知道控件有多大,它就可以开始调整列的大小。

DataGrid是WPF的高度可配置和动态布局系统不起作用的场景的一个很好的例子。为了获得您习惯的性能,您需要使用非WPF网格,该网格能够更好地预测自己的层次结构,从而无需预先渲染所有内容即可执行这些类型的测量。 WPF存在此类控件,但您必须找到它们。

这是xceed中的一个:http://xceed.com/Grid_WPF_Intro.html?gclid=CNKE8rOBtrICFQfonAodHQ8AEA

这是来自Telerik的一个:http://www.telerik.com/products/wpf/gridview.aspx

(由于需要平衡灵活性和性能,以及现代数据网格中预期的大量功能,这种控制一直被认为是控制开发的巅峰之作。良好的数据网格很难构建。在Excel中,微软构建了一个完整的应用程序,基本上是一个美化的数据网格。所有这一切,你可能无法找到你想要的免费内容。)

请参阅此问题:WPF DataGrid Vs Windows Forms DataGridView