2011-01-31 57 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>