我们有一个自定义的 DataGrid 控件,它动态生成由 XML 结构确定的列。
创建每一列时,我们给它一个带星号的单位类型,因为我们希望确保 DataGrid 中永远不会有任何水平滚动。
DataGridTextColumn column = new DataGridTextColumn();
column.Width = new DataGridLength(entity.DisplaySize, DataGridLengthUnitType.Star);
但是,我们已经注意到,当 DataGrid 被呈现时,它以给定列的最小大小呈现,然后一旦 DataGrid 完全呈现,它就会调整列的大小以正确适应 DataGrid。这会导致闪烁效果。
有没有人有任何可能的解决方案?也许如何在后台渲染 DataGrid,然后在列完成后显示?还是有其他想法?
最佳答案
不幸的是,这是正常行为。它与控件的呈现方式有关。在 WPF 中,您有一层又一层的控件,DataGrid 在完成渲染之前无法知道控件的种类。
所以第一个布局 channel 创建控件,但它必须通过第二个 channel 来测量这些控件的大小。一旦它知道控件有多大,它就可以开始调整列的大小。
DataGrid 是 WPF 的高度可配置和动态布局系统不起作用的场景的一个很好的例子。要获得您习惯的那种性能,您需要使用非 WPF 网格,该网格能够更好地预测其自身的层次结构,从而执行这些类型的测量,而无需预渲染所有内容。 WPF 存在此类控件,但您必须找到它们。
这是来自 xceed 的一个:http://xceed.com/Grid_WPF_Intro.html?gclid=CNKE8rOBtrICFQfonAodHQ8AEA
这是来自 Telerik 的一个:http://www.telerik.com/products/wpf/gridview.aspx
(由于需要平衡灵活性和性能,以及现代数据网格中预期的大量功能,此控件长期以来一直被视为控件开发的顶峰。好的数据网格极难构建。在 Excel 中,Microsoft 构建了一个整个应用程序,本质上是一个美化的数据网格。所有这一切,你可能不会免费找到你正在寻找的东西。)
看到这个问题:WPF DataGrid Vs Windows Forms DataGridView
关于.net - WPF 数据网格和动态列宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12428774/