【问题标题】:WPF datagrids and dynamic column widthsWPF 数据网格和动态列宽
【发布时间】:2012-09-07 20:52:35
【问题描述】:

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

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

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

但是,我们注意到,在渲染 DataGrid 时,它会以指定给列的最小大小进行渲染,然后在完全渲染 DataGrid 后,它会调整列的大小以正确适应 DataGrid。这会导致闪烁效果。

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

【问题讨论】:

  • 这是一个很好的问题。我遇到了完全相同的问题,但没有找到解决方案。
  • 这在 WinForms 中运行良好,似乎只是 WPF 问题。我们尝试在渲染期间暂停布局,但该方法也没有成功,没有任何区别。
  • 您是否尝试过仅使用 XAML 的方法?
  • @BigDaddy 他将如何在 XAML 中动态创建列?
  • 采用纯 WPF 方法实际上并不难,但结果不会比已经使用的方法好(而且可能会更糟)。

标签: .net wpf datagrid resize


【解决方案1】:

不幸的是,这是正常行为。它与控件的呈现方式有关。在 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

【讨论】:

    【解决方案2】:

    我认为您不会在后台渲染。它的布局方式有两遍。

    Layout System

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

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

    【讨论】:

      猜你喜欢
      • 2016-05-12
      • 2017-05-12
      • 2016-04-21
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 2010-12-30
      • 2021-08-19
      相关资源
      最近更新 更多