1

TextBoxes のセットを上下に並べてレイアウトしようとしています。ウィンドウの高さに収まらないほど多くの TextBox がある場合は、ウィンドウで ScrollBar を使用できるようにします。inputTextBoxesの数は可変です。という名前の最後の TextBox が常に存在しますoutput

すべての TextBoxes がウィンドウの高さ内に表示できる場合、最後の TextBox を下まで伸ばして残りのスペースをすべて埋めます。さらに、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 を削除することで、この問題を解決できます。ただし、それを行うと、別の問題が発生します。TextBoxesの数inputは可変であるため、すべての TextBoxes を Window に表示できないほど多くの TextBoxes がある場合、Window は必要な ScrollBar を取得しません。

MaxHeight をoutputTextBox に配置して遊んでみましたが、TextBox が少なくinput、背の高い Window がある場合、残りの垂直スペースをすべて埋められない傾向があります。

4

2 に答える 2

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 に答える
1

Output TextBox を 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>

2番目の編集:

<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 に答える