12

私は問題があります。UI でテキストボックスが切り捨てられたりゼロに折りたたまれたりしないように、ScrollViewer でコントロールを使用してグリッドをホストする必要があります。また、ユーザーがウィンドウの幅を変更したときにテキストボックスを拡張したい。Windowのコンテンツを次のコードに設定しています

<DockPanel>
    <TreeView DockPanel.Dock="Left" Width="150"/>
    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <TextBlock Text="Name" 
                       Margin="5" 
                       VerticalAlignment="Center"/>
            <TextBox Grid.Column="1"
                     Text="Some Name"
                     Margin="5"
                     VerticalAlignment="Center"
                     MinWidth="200"/>
        </Grid>
    </ScrollViewer>
</DockPanel>

すべて正常に動作しますが、ユーザーが TextBox に非常に長いテキストを入力すると、展開されて水平スクロールが表示されます。TextBox の最大幅を制限し、ユーザーがウィンドウ サイズを変更した場合にのみ拡張できるようにする簡単な方法はありますか。

4

2 に答える 2

38

問題は、親要素が TextBox に必要と思われるだけのスペースを提供していて、それ以上のテキストが存在すると、初期の自動サイズにとどまらずに拡大することです。

ここでの 1 つの解決策は、別の自動サイズの要素を作成し、それに TextBox.Width をバインドすることです。

<DockPanel>
    <TreeView Width="150" DockPanel.Dock="Left"/>
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <TextBlock Margin="5" VerticalAlignment="Center" Text="Name"/>
            <Border x:Name="b" Grid.Column="1" Margin="5"/>
            <TextBox Width="{Binding ActualWidth, ElementName=b}"
                     MinWidth="200"
                     Grid.Column="1"
                     Margin="5"
                     VerticalAlignment="Center"
                     Text="Some Name"/>
        </Grid>
    </ScrollViewer>
</DockPanel>

自動サイズ変更要素 (Border) の Margin プロパティを設定していることに注意してください。 設定されていない場合、ループが発生するため、これは重要です。

  1. 境界線の幅はグリッド列の幅に自動調整されます
  2. TextBox の幅は Border.ActualWidth にサイズ変更されます
  3. グリッド列の幅は、TextBox の幅 + TextBox の余白にサイズ変更されます
  4. 境界線の幅が再びグリッド列の幅に自動調整されます

Margin を TextBox と同じに設定すると、TextBox のサイズ変更はグリッド サイズに影響しません。

于 2008-12-22T20:55:28.210 に答える
2

TextBox.MeasureOverrideそのようにオーバーライドするとうまくいきました:

protected override Size MeasureOverride(Size constraint)
{
    Size origSize = base.MeasureOverride(constraint);
    origSize.Width = MinWidth;
    return origSize;
}
于 2011-11-25T22:08:20.133 に答える