2010-01-21 86 views
1

UserControl我试图用基本上奠定了像这样的工作:然后WPF网格和DataGrid大小

<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放在我的WindowGrid的最后一个成员,是唯一一个与Height="*"。我在DataGrid的尺寸方面遇到问题。

如果我在Window设置UserControlStretchVerticalAlignment,然后PrimaryGrid得到1/2高度UserControl的,每一两个Border内得到1/4。无论每个行的行数是多少,它们的大小都是这样,使OtherGrid的垂直空间太少,而其他行在滚动视图内的非行空白。

如果我将VerticalAlignment设置为Top,网格看上去与其内容大小相当一致,除了UserControl底部留有无法解释的空白。我用探听和RowDefinitionUserControl具有适当ActualHeight,但UserControl仅使用其一部分 - 80%左右。

我不介意我是否修复Stretch情况下(我如何让DataGrid不拉伸比它的行数?大)或Top情况下(我如何让UserControl使用它拥有的所有空间?提供给它)

回答

0

嗯,这就是我最终的结果。它主要是从布局的角度来做我想要的。多一点的代码比我想要的还要多,但是哦。

在我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中的用户控件。现在一切都很好。

再次感谢您看我的问题。

3

摘要:使用你的用户控件里面的行高度Stretch的用户控件,但Auto(而不是*)。

说明:“自动” means:根据需要(这是你想要的)一样多的空间,而“*”表示:所有可用空间的比例份额(导致1/2,1/4 ,1/4分布)。

既然你想要的用户控件使用所有可用空间,Stretch是正确的选项(这意味着正是)。如果您希望此行占据剩余的可用空间,请将的一个的UserControl内部的UserControl重新设置回“*”。

+0

我会给它一个镜头,但上次我尝试Auto时,OtherGrid展开窗口的底部,没有滚动条。 – Thomas 2010-01-21 22:39:50

+0

是的,所有的汽车绝对不好。 使两个网格自动,*有点作品,直到我缩小窗口。然后PrimaryGrid不缩小,边界逐渐消失。也许我可以给他们一个与ActualHeight比例相关的maxheight。但那似乎是如此没有必要。 我想我想将DataGrid的MaxHeight绑定到它的ScrollableHeight,但这似乎不起作用。 – Thomas 2010-01-21 22:51:46

+0

作为一种替代方法:如何使用Auto并将整个UserControl放入ScrollViewer中?这样,每个DataGrid应该可以获得所需的空间,并且可以使用(全局)滚动条来滚动。 – Heinzi 2010-01-21 23:41:54

1

这是一个常见的问题,你真正想要的是2种完全不同的布局行为:自动调整大小时,有足够的空间为所有三个,*施胶时没有。一些快速修复,你可以尝试使用限制:

  • 自动调整大小(前面已经提到)
  • DockPanel中每一组对接=顶部 - 这将产生类似的效果,以VerticalAlignment =顶部,但最后的DataGrid(只有1)将伸出来填补剩余的空间。如果第一个或第二个占用更多空间而不是存在,也是不好的,因为他们会将其他人推出。
  • 将MinHeight/MaxHeight与您的DataGrid上的其他2个更改之一结合使用,以防止它们失控。这放弃了一些自动布局的灵活性,以确保一切都显示出来。

除了这些,你可以尝试更复杂的东西,如创建一个自定义面板(或找到一个别人已经取得),或创建一个可以计算出合适的高度(或了minHeight,MaxHeight)一MultiValueConverter设置每个DG或根据UC的高度和每个DG的高度来划分。

+0

谢谢你的想法。投了票。 – Thomas 2010-01-21 23:20:04

0

只是想跟进这个问题。随着时间的推移,我上面提供的解决方案并没有达到用户的期望。我现在已经改为方案是这样的:

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

在我用这个成语另一个地方,我已经设置了调整器具有绑定到ScrollViewer中的一个的ActualHeight到MaxHeight防止其外出的控制。这个设计可能会让整个滚动条和DataGrid中的滚动条有点混淆,但是边框和边距很好,但这并不算太坏。