WPF数据网格和动态列宽

12
我们有一个自定义的DataGrid控件,它根据XML结构动态生成列。在创建每个列时,我们使用星号单位类型,因为我们希望确保DataGrid中永远没有水平滚动条。
            DataGridTextColumn column = new DataGridTextColumn();
            column.Width = new DataGridLength(entity.DisplaySize, DataGridLengthUnitType.Star);

但是,我们注意到当DataGrid被渲染时,它会以列所给定的最小尺寸进行渲染,然后一旦DataGrid完全渲染完成,它才会调整列的大小以适应DataGrid。这会导致闪烁效果。

有没有可能的解决方案?也许可以在后台渲染DataGrid,然后在列完成调整后再显示它?或者其他任何想法?


1
这是一个非常好的问题。我也遇到了完全相同的问题,但是还没有找到解决方案。 - WPFNewbie
这在WinForms中运行良好,似乎只是WPF的问题。我们尝试在渲染过程中暂停布局,但该方法也没有成功,没有任何区别。 - WPFNewbie
你尝试过使用仅限XAML的方法吗? - Big Daddy
@BigDaddy 他该如何在XAML中动态创建列? - paparazzo
采用纯WPF方法并不是非常困难,但结果不会比已经使用的方法更好(而且可能会更糟)。 - JDB
2个回答

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

0

我认为你不会在后台进行渲染。它进行布局的方式有两个步骤。

布局系统

当我点击一个按钮时,我会遇到这个问题,其中该按钮是一个ListItem。该按钮导致上面的一些内容发生变化,并且它改变了按钮的位置,以便在同一位置上有另一个按钮。单击事件会处理错误的按钮。当我尝试将代码简化为可以发布到SO上的简单内容时,它可以正常工作。

在DataGrid上,我处理它的方式是使用ListView GridView并计算每列的宽度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接