【问题标题】:WPF DataGrid window resize does not resize DataGridColumnsWPF DataGrid 窗口调整大小不会调整 DataGridColumns 的大小
【发布时间】:2011-02-13 07:28:44
【问题描述】:

我的应用程序中有一个 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 派生一个子类并覆盖 DataGrid 的 OnRenderSizeChanged 方法来解决问题 3,如下所示。

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。我怎样才能摆脱它们?

【问题讨论】:

    标签: datagrid resize wpftoolkit


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我也遇到了和你说的一样的问题。我在互联网上搜索了一下,可能找到了解决方案。该解决方案实际上对我有效。 从 C# 代码中设置 * 值。 这里是代码sn-p,

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

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

      享受大师。

      【讨论】:

        【解决方案3】:

        以下覆盖修复了宽度变大的大小问题,包括最大化。但仍然不是恢复大小的问题。

        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 模板时才出现的,所以它看起来像是一个错误。

        【讨论】:

          【解决方案4】:

          所有 DataGridTextColumn 的默认 MinWidth 属性设置为 20。因此,如果您想在从最大调整到最小后控制宽度,您必须自己指定此值。我的建议是:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-06-17
            • 2013-07-10
            • 2011-11-20
            • 2011-03-30
            • 2019-05-15
            • 2016-09-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多