2010-04-28 230 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; 
      } 
     };