11

ウィンドウには、2つの列を持つグリッドがあります。左側の列には、幅は一定ですが、高さが適応するコントロールが含まれています。右側の列には、グリッド内(およびウィンドウ内)の残りのすべてのスペースを占めるTextBoxが含まれています。

グリッドには最小の幅と高さが与えられ、ScrollViewer内にラップされます。ユーザーがウィンドウのサイズを変更してグリッドの最小幅/高さよりも小さくすると、スクロールバーが表示されます。

これがまさに私が望んでいることです。ただし、ユーザーがテキストの入力を開始すると問題が発生します。テキストが長すぎてTextBoxの1行に収まらない場合は、テキストを折り返す必要があります。したがってTextWrapping="Wrap"、TextBoxを設定しました。ただし、TextBoxには自動幅があり、ScrollViewer(実際にはラップされているグリッド全体)でラップされているため、TextBoxは右に拡大し続けます。

ウィンドウが拡張された場合にTextBoxを拡張したいのですが、TextBoxをテキストで拡張したくありません。むしろ、テキストは利用可能なTextBox内で折り返される必要があります。テキストがTextBoxの高さに収まらない場合は、TextBox内にスクロールバーを表示する必要があります。

これを達成する方法はありますか?

以下は私の問題を示すいくつかのコードです:

<Window x:Class="AdaptingTextBoxes.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="300" Width="400" Background="DarkCyan">
<Grid Margin="10" Name="LayoutRoot">
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
        <Grid MinWidth="300" MinHeight="200">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>

            <Button Grid.Column="0" Margin="0,0,10,0" Content="Button" Width="100" />

            <TextBox Grid.Column="1" AcceptsReturn="True" TextWrapping="Wrap" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto" />
        </Grid>
    </ScrollViewer>
</Grid>
</Window>
4

3 に答える 3

15

目に見えない境界線を使用することもできます(ハッキーですが機能します-Xamlで動的テキストボックスのサイズを分類する傾向があります):

<Border BorderThickness="0" x:Name="border" Grid.Column="1" Margin="0.5" />
<TextBox Grid.Column="1" AcceptsReturn="True" TextWrapping="Wrap" Width="{Binding ActualWidth, ElementName=border}" Height="{Binding ActualHeight, ElementName=border}" />
于 2010-04-07T10:08:01.963 に答える
1

MaxWidthTextBoxだけにプロパティを設定してみましたか?

OPのコメント後に編集

私はを取り除くことを試みScrollViewerます。のレイアウトで使用されるサイズGrid設定はサイズ変更を処理する必要があり、のスクロールバー設定TextBoxが残りを処理する必要があります。

于 2010-04-07T10:08:51.267 に答える
1

答えはLeomの答えに基づいています。

ウィンドウを拡大するとこのソリューションはうまく機能しますが、ウィンドウを小さくするとサイズ変更がスムーズになりません。テキストボックスはグリッドのレイアウトに参加するため、レイアウト プロセスを複数回実行する必要があります。テキストボックスをキャンバスに配置することでこれを修正できるため、テキストボックスのサイズを変更してもグリッドの再レイアウトがトリガーされなくなります。

更新されたコード:

<Border BorderThickness="0" x:Name="border" Grid.Column="1" Margin="0.5" />
<Canvas Grid.Column="1">
    <TextBox AcceptsReturn="True" TextWrapping="Wrap" Width="{Binding ActualWidth, ElementName=border}" Height="{Binding ActualHeight, ElementName=border}" />
</Canvas>
于 2016-06-21T10:49:21.923 に答える