[英]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和UserControl
的RowDefinition
具有正確的ActualHeight
,但UserControl
只使用它的一部分 - RowDefinition
80%左右。
我真的不介意我是否修復Stretch
情況(如何使DataGrid
不會拉伸大於其行數?)或Top
case(如何讓UserControl
使用它可用的所有空間? )
簡介 :對UserControl使用Stretch
,但對UserControl中的行高使用Auto
(而不是*
)。
說明 :“自動” 表示 :盡可能多的空間(這是您想要的),而“*”表示:所有可用空間的比例份額(產生1 / 2,1 / 4,1 / 4分布) )。
由於您希望UserControl使用所有可用空間,因此Stretch
是正確的選項(這意味着)。 如果希望此行占用剩余的可用空間,請將UserControl中的一個行高設置為“*”。
這是一個常見的問題,你真正想要的是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.