2011-01-31 32 views
3

我有一个网格有几个孩子,其中一个是ScrollViewer。我希望网格根据其所有子项调整大小,但除了 ScrollViewer外,我想只占用通过为其他子项调整网格大小创建的空间。 (例如,网格为2 x 2,滚动查看器位于第0行0列,因此其他三个网格条目足以确定网格的尺寸。)确定大小时,使WPF/SL网格忽略子元素

有没有一种很好的方法可以做到这一点?我研究过创建一个自定义面板来替换网格或者包含ScrollViewer,但是在MeasureOverride/ArrangeOverride调用期间,我是否会收到一个调用,它可以告诉我关于网格行的最终宽度/高度/我关心的列(例如,第0行,第0列)。

我想过的一个想法是从网格中派生出来并调用基础MeasureOverride/ArrangeOverride,但是在调用之前从调用之前(并将它放回)之后从网格的子节点中移除ScrollViewer,但在布局过程中与可视化树相混淆计算似乎是一个坏主意。

下面是一个例子:

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid VerticalAlignment="Top" HorizontalAlignment="Left"> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <ScrollViewer Grid.Row="0" Grid.Column="0" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto"> 
      <Button Height="300" Width="300"/> 
     </ScrollViewer> 
     <Button Grid.Row="1" Grid.Column="0" Height="100" Width="100" Content="1,0"/> 
     <Button Grid.Row="0" Grid.Column="1" Height="100" Width="100" Content="0,1"/> 
     <Button Grid.Row="1" Grid.Column="1" Height="100" Width="100" Content="1,1"/> 
    </Grid> 
</Grid> 

我想网格的大小,而不是在ScrollViewer中按钮的大小变化而变化 - 例如,我想网格给予ScrollViewer中的100×100平方这是由网格内容的其余部分决定的。如果我将3个100x100按钮中的每一个都更改为200x200,我希望ScrollViewer获得200x200等等。

Pavlo的示例使我与目前最接近,Grid行/列大小适当,但ScrollViewer的确不适应调用Arrange时给定的大小。请看下图:

Image showing effect of Pavlo's NoSizeDecorator

+0

请提供一个XAML的例子,它很难准确理解你需要什么。 – danbord 2011-01-31 17:51:00

+0

当然,好点。我刚刚加了一个。 – aggieNick02 2011-01-31 18:19:53

回答

6

如果我理解正确的,你想要什么,那么你可以做下面的技巧。创建一个装饰,将在整理阶段,在措施阶段要求0的空间,将安排孩子与所有给定空间:

public class NoSizeDecorator : Decorator 
{ 
    protected override Size MeasureOverride(Size constraint) { 
     // Ask for no space 
     Child.Measure(new Size(0,0)); 
     return new Size(0, 0); 
    }   
} 

而且你的XAML看起来就像这样:

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid VerticalAlignment="Top" HorizontalAlignment="Left"> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <my:NoSizeDecorator Grid.Row="0" Grid.Column="0"> 
      <ScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto"> 
       <Button Height="300" Width="300" Content="0,0"/> 
      </ScrollViewer> 
     </my:NoSizeDecorator> 

     <Button Grid.Row="1" Grid.Column="0" Height="100" Width="100" Content="1,0"/> 
     <Button Grid.Row="0" Grid.Column="1" Height="100" Width="100" Content="0,1"/> 
     <Button Grid.Row="1" Grid.Column="1" Height="100" Width="100" Content="1,1"/> 
    </Grid> 
</Grid>