12

我有个问题。我需要在 ScrollViewer 中托管带有控件的网格,以防止文本框在 UI 处被截断或折叠为零。我还希望在用户更改窗口宽度时扩展文本框的 with。我将 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 提供了它认为需要的尽可能多的空间,并且当存在更多文本时,它会扩展而不是保持初始自动大小。

这里的一个解决方案是制作另一个自动调整大小的元素并将 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>

请注意,我们设置了自动调整大小元素(边框)的 Margin 属性。 这很重要,因为如果没有设置,就会出现循环:

  1. 边框宽度自动调整为网格列宽
  2. 文本框宽度调整为 Border.ActualWidth
  3. 网格列宽调整为 TextBox 宽度 + TextBox 边距
  4. 边框宽度再次自动调整为网格列宽

通过将 Margin 设置为与 TextBox 相同,TextBox 的大小调整不会影响 Grid 的大小。

于 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 回答