【发布时间】:2011-06-18 18:03:31
【问题描述】:
我有一个 Grid,它有几个孩子,其中一个是 ScrollViewer。我希望 Grid 根据其所有子级除了 ScrollViewer 来调整自身的大小,我只想占用通过调整 Grid 为其其余子级大小而创建的空间。 (比如 Grid 是 2x2 并且 ScrollViewer 在第 0 行第 0 列,所以其他三个 Grid 条目足以确定 Grid 的尺寸。)
有什么好的方法可以做到这一点吗?我已经考虑创建一个自定义面板来替换网格或包含 ScrollViewer,但在 MeasureOverride/ArrangeOverride 调用期间,我从来没有接到过可以告诉我网格行的最终宽度/高度的电话/我关心的列(例如,第 0 行,第 0 列)。
我的一个想法是从 Grid 派生并调用基本 MeasureOverride/ArrangeOverride 但在调用之前从 Grid 的子项中删除 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>
我希望 Grid 的大小不会随着 ScrollViewer 中 Button 的大小的变化而改变 - 例如,我希望 Grid 为 ScrollViewer 提供 100x100 的正方形,该正方形由 Grid 的其余内容决定。如果我将 3 个 100x100 按钮中的每一个更改为 200x200,我希望 ScrollViewer 获得 200x200 等。
到目前为止,Pavlo 的示例让我最接近,Grid 行/列的大小适当,但 ScrollViewer 不适应在调用 Arrange 时给它的 Size。见下文:
【问题讨论】:
-
请提供一个 XAML 的例子,它很难理解你到底需要什么。
-
当然,好点。我刚加了一个。
标签: wpf silverlight layout grid