簡體   English   中英

WPF Grid和DataGrid大小調整

[英]WPF Grid and DataGrid sizing

我試圖使用的UserControl基本上是這樣布局的:

<Grid>
   <Grid.RowDefinitions>
       <Row Height="*"/>
       <Row Height="*"/>
   </Grid.RowDefinitions>
   <wpftoolkit:DataGrid x:Name="PrimaryGrid"/> <!-- ~10 rows -->
   <Border>
      <Grid>
         <Grid.RowDefinitions>
             <Row Height="*"/>
             <Row Height="*"/>
         </Grid.RowDefinitions>
         <wpftoolkit:DataGrid x:Name="SecondaryGrid"/> <!-- ~2 rows -->
         <wpftoolkit:DataGrid x:Name="OtherGrid"/> <!-- ~50 rows -->
      </Grid>
   </Border>
</Grid>

然后將此UserControl作為Grid的最后一個成員放在我的Window中,唯一一個Height="*" 我對DataGrid的大小調整方式有疑問。

如果我在Window中將UserControl VerticalAlignment設置為Stretch ,則PrimaryGrid將獲得UserControl 1/2高度,並且Border內的兩個中的每一個都獲得1/4。 無論每個行的行數是多少,它們的大小都是這樣的,使得OtherGrid垂直空間太小而OtherGrid的其他行具有非行空格。

如果我將VerticalAlignment設置為Top ,則網格的大小似乎與其內容相當,除非在UserControl的底部留下一個莫名其妙的空白。 我使用Snoop和UserControlRowDefinition具有正確的ActualHeight ,但UserControl只使用它的一部分 - RowDefinition 80%左右。

我真的不介意我是否修復Stretch情況(如何使DataGrid不會拉伸大於其行數?)或Top case(如何讓UserControl使用它可用的所有空間? )

簡介 :對UserControl使用Stretch ,但對UserControl中的行高使用Auto (而不是* )。

說明 :“自動” 表示 :盡可能多的空間(這是您想要的),而“*”表示:所有可用空間的比例份額(產生1 / 2,1 / 4,1 / 4分布) )。

由於您希望UserControl使用所有可用空間,因此Stretch是正確的選項(這意味着)。 如果希望此行占用剩余的可用空間,請將UserControl中的一個行高設置為“*”。

這是一個常見的問題,你真正想要的是2種完全不同的布局行為:當有三個空間時自動調整大小,*沒有時調整大小。 您可以通過限制嘗試一些快速修復:

  • 自動調整大小(如前所述)
  • DockPanel,每個設置為Dock = Top - 這將對VerticalAlignment = Top產生類似的效果,但最后一個DataGrid(僅1)將拉伸以填充剩余空間。 如果第一個或第二個占用的空間比存在的多,那也很糟糕因為他們會把其他人推出去。
  • 將MinHeight / MaxHeight與DataGrids中的其他2個更改之一結合使用,以防止它們失控。 這樣可以放棄一些自動布局的靈活性,以確保一切都顯示出來。

除此之外,您可以嘗試更復雜的內容,例如創建自定義面板(或找到其他人已經制作的面板),或者創建一個MultiValueConverter,可以根據高度為每個DG或行計算適當的高度(或MinHeight,MaxHeight)設置。 UC和每個DG。

好吧,這就是我最終的結果。 它主要是從布局的角度來做我想要的。 比我想要的更多的代碼,但哦,好吧。

在我的DataContextChanged事件處理程序中:

//for each grid
_reportObserver = new PropertyObserver<ItemCollection>(PrimaryGrid.Items)
    .RegisterHandler(c => c.Count, c => UpdateMaxHeight(PrimaryGrid));
UpdateMaxHeight(PrimaryGrid);

PropertyObserver來自http://joshsmithonwpf.wordpress.com/2009/07/11/one-way-to-avoid-messy-propertychanged-event-handling/

//Lots of ugly hard-coding     
private void UpdateMaxHeight(DataGrid grid)
{
   double header_height = grid.ColumnHeaderHeight;
   if (double.IsNaN(header_height))
      header_height = 22;
   double margin_height = grid.Margin.Bottom + grid.Margin.Top;
   grid.MaxHeight = header_height + margin_height + grid.Items.Count * (grid.RowHeight+2);

   UpdateLayout(); //this is key for changes to number of items at runtime
}

即使在設置DataGrid的MaxHeight后,事情仍然很難看,所以我不得不在RowDefinition上設置最大高度。 但這仍然是不對的,導致margin_height添加到上面。

<RowDefinition Height="*" MaxHeight="{Binding ElementName=PrimaryGrid, Path=MaxHeight}"/>

在某些時候,我會在丑陋的最大高度代碼中考慮我可選擇的可見行詳細信息。

至於Top vs Stretch,我最終還是出於其他原因而在ListView中使用了usercontrol。 現在一切都很好。

再次感謝您查看我的問題。

只是想跟進這個問題。 隨着時間的推移,我上面提供的解決方案不符合用戶的期望。 我現在改為這樣的計划:

<ScrollViewer VerticalScrollBarVisibility="Auto">
   <Grid>
      <!-- row definitions -->
      <KentBoogart's Resizer ResizeDirection="South">
         <DataGrid/>
      </kb:Resizer>
      <kb:Resizer ResizeDirection="South">
         <DataGrid/>
      </kb:Resizer>
   </Grid>
</ScrollViewer>

在我使用這個習語的另一個地方,我設置了Resizer,將MaxHeight綁定到ScrollViewer的ActualHeight,以防止它失去控制。 這個設計可能會讓整個滾動條與DataGrid中的滾動條有點混淆,但是邊框和邊距都很好,也不算太糟糕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM