我有以下XAML:
<StackPanel HorizontalAlignment="Center">
<Image Name="logo" Source="logo.png" Margin="0,0,0,50"/>
<ScrollViewer>
<Dashboard_Control:AlignableWrapPanel x:Name="wrapPanel"/>
</ScrollViewer>
<TextBlock FontWeight="Bold" HorizontalAlignment="Center" x:Name="txtBottomText"></TextBlock>
</StackPanel>
我希望wrapPanel
仅可滚动,因此当您滚动时txtBottomText
控件将始终位于底部,而logo
图像控件将始终位于top - 基本上只允许wrapPanel
可滚动。
我尝试过如上所示添加ScrollViewer,但它从未显示过。我甚至尝试添加一个属性来始终使用垂直滚动条,但是它不会让我滚动(滚动条被禁用)。
我怀疑这是因为我的wrapPanel的内容是在运行时动态生成的,如下所示:
wrapPanel.Children.Add(content);
我有什么想法可以解决这个问题吗?
答案 0 :(得分:1)
这不是因为你的wrapPanel的内容。但是因为您正在使用StackPanel来包含所有内容。
StackPanels在其Orientation
属性确定的方向上无限增长。默认情况下,这是垂直的。
在你的情况下,这使得ScrollViewer&#34;思考&#34;它有足够的可用空间来伸展自己以容纳其内容,而不是激活滚动条。因此,当内部的WrapPanel变大时,它会变得更大,从而推动TextBlock。
为避免这种情况,您需要使用能够为每个控件正确分配可用空间的其他Panel。像网格一样。
<Grid HorizontalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Image Name="logo" Source="logo.png" Margin="0,0,0,50"/>
<ScrollViewer Grid.Row="1">
<Dashboard_Control:AlignableWrapPanel x:Name="wrapPanel"/>
</ScrollViewer>
<TextBlock Grid.Row="2" FontWeight="Bold" HorizontalAlignment="Center" x:Name="txtBottomText"></TextBlock>
</Grid>
我经常说StackPanels过度使用:P它们实用且易于使用,但它们有一堆怪癖和限制,使它们不适合许多情况,比如这个。
编辑:同时确保网格不包含在另一个垂直StackPanel,高度设置为Auto
的网格行或类似内容中。
答案 1 :(得分:1)
如果您的WrapPanel的高度超过了您放置控件的控件或窗口的高度,则堆栈面板内部的Wrap Panel下方的Textblock将放在Wrap面板之后,因此它位于滚动区域下方。 为了能够始终显示Textblock,您有两种方法: 1)限制Wrap面板的高度 2)使用一个容器,如一个3行的Grid,而不是堆栈面板,并分别将Grid的Row Heights放入 自动,*,自动,以便顶部的图像和底部的文本块使用其内容的空间,并且“滚动”面板使用剩余的所有空间
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Image Grid.Row ="0" Source="myimage.jpg" />
<ScrollViewer Grid.Row="1">
<WrapPanel Height="1200" Width="600">
<TextBlock>Ciao sono io</TextBlock>
</WrapPanel>
</ScrollViewer>
<TextBox Grid.Row="2" TextWrapping="Wrap" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Text="IO c'ero" />
</Grid>
答案 2 :(得分:0)
你必须为你的滚动查看器设置一个固定的高度 - 如果没有,滚动查看器会占用他需要的空间,以显示其子项的完整内容。
解决方案: