2010-04-28 320 views
2

我有一个WPF DataGrid(来自WPFToolkit包)像我的应用程序中的以下内容。WPF DataGrid窗口调整大小不会调整大小DataGridColumns

<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. 当数据网格的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。我怎样才能摆脱它们?

回答

0

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

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

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

享受古鲁。

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模板,所以它似乎是一个错误。

2

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

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