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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF DataGrid窗口调整大小不会调整DataGridColumns的大小相关的知识,希望对你有一定的参考价值。

我有一个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. 当我用鼠标调整应用程序窗口的大小时,列不会调整大小。

我能够通过从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。我怎么能摆脱他们?

答案

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

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

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

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

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

享受大师。

另一答案

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

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。

另一答案

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

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

以上是关于WPF DataGrid窗口调整大小不会调整DataGridColumns的大小的主要内容,如果未能解决你的问题,请参考以下文章

WPF Toolkit DataGrid 列调整大小事件

DataGridColumn 不调整大小

WPF DataGrid MaxWidth 设置为 100% 可用空间

WPF:调整图像大小,但仅在用户调整UI大小时

WPF窗口不允许调整大小

添加数据时 WPF DataGrid 的高度会增加