1

我正在尝试垂直布局一组文本框,一个在另一个之上。如果有太多的 TextBoxes 无法容纳在 Window 高度内,那么我希望 ScrollBar 在 Window 上可用。文本框的数量input是可变的。总是有一个名为 的最后一个文本框output

如果所有文本框都可以出现在窗口高度内,那么我希望最后一个文本框拉伸到底部并填充所有剩余空间。此外,如果outputTextBox 有很多 Text,那么我希望这个 TextBox 可以提供 ScrollBar。

这是我所拥有的一些伪 XAML:

<ScrollViewer>
    <Grid>
        <TextBox Name="input1" Margin="12, 12, 12, 12" VerticalAlignment="Top" HorizontalAlignment="Left" />
        <TextBox Name="input2" Margin="12, 60, 12, 12" VerticalAlignment="Top" HorizontalAlignment="Left" />
        <TextBox Name="input3" Margin="12, 108, 12, 12" VerticalAlignment="Top" HorizontalAlignment="Left" />
        ...
        <TextBox Name="inputN" Margin="12, ((N - 1) * 48 + 12), 12, 12" VerticalAlignment="Top" HorizontalAlignment="Left" />
        <TextBox Name="ouput" Margin="12, (N * 48 + 12), 12, 12" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />
    </Grid>
</ScrollViewer>

我现在遇到的问题是,如果outputTextBox 有很多内容,那么它的高度会增加,并且 Window 会出现一个 ScrollBar。相反,我希望outputTextBox 获得 ScrollBar。

我可以通过删除持有 Grid 的 ScrollViewer 来解决这个问题。但是,如果我这样做,我会遇到另一个问题。因为文本框的数量input是可变的,所以如果有太多以至于不是所有的文本框都可以显示在窗口中,那么窗口就没有我需要的滚动条。

我曾尝试在outputTextBox 上放置 MaxHeight,但如果 TextBox 很少input且窗口很高,那么我很可能无法填充所有剩余的垂直空间。

4

2 回答 2

1

听起来您需要将输出文本框包装在 ScrollViewer 中,并确保它确实留在底部(在 Grid 中定义一些行或将其停靠在 DockPanel 的底部。

编辑:你需要这样的东西吗?

<Grid x:Name="grd01">
  <Grid.RowDefinitions>
    <RowDefinition />
    <RowDefinition Height="35" />
  </Grid.RowDefinitions>

  <ScrollViewer Grid.Row="1">
    <TextBox HorizontalAlignment="Stretch" TextWrapping="Wrap" />
  </ScrollViewer>
</Grid>

第二次编辑:

<Grid x:Name="grd01">
  <Grid.RowDefinitions>
    <RowDefinition />
    <RowDefinition Height="35" />
  </Grid.RowDefinitions>

  <ScrollViewer Grid.Row="0">
    <StackPanel>
      <TextBox x:Name="input"
                HorizontalAlignment="Stretch"
                TextWrapping="Wrap" />
    </StackPanel>
  </ScrollViewer>

  <ScrollViewer Grid.Row="1">
    <TextBox x:Name="output"
              HorizontalAlignment="Stretch"
              TextWrapping="Wrap" />
  </ScrollViewer>
</Grid>
于 2012-07-05T14:30:46.120 回答
1

您可以使用以下代码对窗口加载事件使用此调整: 编辑:我修改了它,因此如果现在调整大小它甚至是正确的

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        output.MaxHeight = output.ActualHeight;
        output.VerticalAlignment = VerticalAlignment.Top;
        output.Height = output.MaxHeight;
    }

    private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        output.MaxHeight = output.MinHeight = output.Height = outGrid.ActualHeight;
    }

-

<ScrollViewer Height="Auto">
    <DockPanel>
        <StackPanel DockPanel.Dock="Top" >
            <TextBox VerticalAlignment="Top" HorizontalAlignment="Stretch" />
            <TextBox VerticalAlignment="Top" HorizontalAlignment="Stretch" />
            <TextBox VerticalAlignment="Top" HorizontalAlignment="Stretch" />
            <TextBox VerticalAlignment="Top" HorizontalAlignment="Stretch" />
            <TextBox VerticalAlignment="Top" HorizontalAlignment="Stretch" />
            <TextBox VerticalAlignment="Top" HorizontalAlignment="Stretch" />
        </StackPanel>
        <Grid DockPanel.Dock="Bottom" Name="outGrid">
            <TextBox Name="output" TextWrapping="Wrap" AcceptsReturn="True" HorizontalAlignment="Stretch" VerticalScrollBarVisibility="Auto" VerticalAlignment="Stretch" />
        </Grid>
    </DockPanel>
</ScrollViewer>
于 2012-07-05T14:52:25.293 回答