我有以下测试样本:
<Window x:Class="WpfScrollTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="200" Width="200">
<Border>
<StackPanel>
<Label Width="Auto" Height="Auto" Content="Text to mess up the scrollview"/>
<ScrollViewer Height="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type Border}}, Path=ActualHeight}">
<StackPanel>
<Button MinWidth="100" MinHeight="100" Content="Button"/>
<Button MinWidth="100" MinHeight="100" Content="Button"/>
</StackPanel>
</ScrollViewer>
</StackPanel>
</Border>
</Window>
创造了这个:
Scrollbar bottom missing http://img33.imageshack.us/img33/8200/scrolloffsetmissing.jpg
我的问题是如何动态设置ScrollViewer.Height
,同时仍能看到滚动条的底部?在我的示例中,Height
的{{1}}太长了,因为它上面有ScrollViewer
..
我不想将Label
的{{1}}修复为静态值。
答案 0 :(得分:1)
我建议将外部StackPanel移除到网格,因为Stackpanel不会尊重孩子的大小。并删除ScrollViewer.Height绑定。现在,您只需要为Grid创建两个RowDefinition,并将Label放置到Grid.Row = 0并将ScrollViwer放置到Grid.Row = 1。
代码如下。所以我的提示是,只在必要时使用StackPanel / Canvas,可能是内层。尝试使用Grid更多来获得非常动态的布局。
<Border>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Label Grid.Row="0" Width="Auto" Height="Auto" Content="Text to mess up the scrollview"/>
<ScrollViewer Grid.Row="1" >
<StackPanel>
<Button MinWidth="100" MinHeight="100" Content="Button"/>
<Button MinWidth="100" MinHeight="100" Content="Button"/>
</StackPanel>
</ScrollViewer>
</Grid>
</Border>