12

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

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

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

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

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

4

2 回答 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 中,Microsoft 构建了一个整个应用程序基本上围绕着一个美化的数据网格。所有这些都是说,你可能不会免费找到你要找的东西。)

看到这个问题:WPF DataGrid Vs Windows Forms DataGridView

于 2012-09-14T21:26:53.943 回答
0

我不认为你会在后台渲染。它的布局方式有两个通道。

布局系统

在按钮是 ListItem 的按钮单击时,我会遇到这种情况。该按钮会导致上面的某些内容发生更改,并且会更改按钮的位置,以便在同一位置有另一个按钮。为错误的按钮处理单击事件。当我尝试将代码分解为可以在 SO 上发布的简单内容时,它可以工作。

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

于 2012-09-14T20:59:58.633 回答