如何使某个部分可滚动

时间:2015-07-14 10:27:46

标签: c# .net wpf xaml user-interface

我有以下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);

我有什么想法可以解决这个问题吗?

3 个答案:

答案 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)

你必须为你的滚动查看器设置一个固定的高度 - 如果没有,滚动查看器会占用他需要的空间,以显示其子项的完整内容。

解决方案:

  • 设置scollviewer的高度属性
  • 使用网格而不是堆叠面板将第一行和第三行高度设置为自动