WPF DataGrid窗口调整大小不会调整DataGridColumns的大小

时间:2010-04-28 11:26:43

标签: datagrid resize wpftoolkit

我有一个WPF DataGrid(来自WPFToolkit包),如我的应用程序中的以下内容。

<Controls:DataGrid>
            <Controls:DataGrid.Columns>
                <Controls:DataGridTextColumn Width="1*" Binding="{Binding Path=Column1}" Header="Column 1" />
                <Controls:DataGridTextColumn Width="1*" Binding="{Binding Path=Column2}" Header="Column 2" />
                <Controls:DataGridTextColumn Width="1*" Binding="{Binding Path=Column3}" Header="Column 3" />
    </Controls:DataGrid.Columns>
</Controls:DataGrid>

应自动调整列宽,使所有三列填充网格的宽度,因此我在每列上设置Width="1*"。我遇到了这种方法的两个问题。

  1. 当DataGrid的ItemsSourcenull或空列表时,列的大小不会适合网格的宽度,但具有约20像素的固定宽度。请参阅以下图片:http://img169.imageshack.us/img169/3139/initialcolumnwidth.png
  2. 当我最大化应用程序窗口时,列将不会调整其大小,但保持其初始大小。请参见下图:http://img88.imageshack.us/img88/9362/columnwidthaftermaximiz.png
  3. 当我使用鼠标调整应用程序窗口大小时,列将不会调整大小。
  4. 我能够通过从DataGrid派生一个子类来解决问题#3,并覆盖DataGrid的OnRenderSizeChanged方法,如下所示。

    protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
    {
        base.OnRenderSizeChanged(sizeInfo);
        foreach (var column in Columns)
        {
            var tmp = column.GetValue(DataGridColumn.WidthProperty);
            column.ClearValue(DataGridColumn.WidthProperty);
            column.SetValue(DataGridColumn.WidthProperty, tmp);
        }
    }
    

    不幸的是,这并没有解决问题#1和#2。我该怎样摆脱它们?

4 个答案:

答案 0 :(得分:2)

我和你有完全相同的问题,但我没有听RenderSizeChanged,而是听了SizeChanged事件,它解释了你所有的情况。

dataGrid.SizeChanged += (sender_, arg_) =>
        {
          foreach (var dataGridColumn in dataGrid.Columns)
          {
            DataGridLength dataGridLength = dataGridColumn.Width;
            dataGridColumn.ClearValue(DataGridColumn.WidthProperty);
            dataGridColumn.Width = dataGridLength;
          }
        };

答案 1 :(得分:0)

我也遇到了你所说的同样的问题。我在互联网上搜索了一下,可能找到了解决方案。该解决方案实际上适合我。 从C#代码中设置*值。 这是代码片段,

dg.Coulmns [0] .Width = new DataGridLength(1.0,DatGridLengthUnitType.Star);

将第0列的宽度设置为*。 不要忘记从XAML页面中删除Width =“1 **”。

享受大师。

答案 2 :(得分:0)

以下覆盖修复了宽度增大的尺寸问题,包括最大化。但仍然没有恢复大小问题。

protected override void OnChildDesiredSizeChanged(UIElement e)
{
    base.OnChildDesiredSizeChanged(e);

    if (e.FindChild<DataGrid>() != null)
    {
        foreach (var column in dataGridMain.Columns)
        {
            var tmp = column.GetValue(DataGridColumn.WidthProperty);
            column.ClearValue(DataGridColumn.WidthProperty);
            column.SetValue(DataGridColumn.WidthProperty, tmp);
        }
    }
}

PS这个问题只有在我为DataGrid定义GroupStyle模板时才出现,所以它看起来像是一个bug。

答案 3 :(得分:0)

所有DataGridTextColumn的默认MinWidth属性均设置为20。因此,如果要在从max调整为min后控制宽度,则必须自己指定此值。我的建议是:

    <DataGridTextColumn Header="Perfect&#x0a;column" Binding="{Binding SomeMember}" MinWidth="120" Width="120*"/>