TextBox的ExtentWidth未正确设置

时间:2015-11-09 13:03:01

标签: c# wpf

我最近经历过一个奇怪的文本框行为。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="200"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Label Content="Test"/>
    <TextBox Grid.Column="1" TextWrapping="Wrap" Text="testtesttesttesttesttesttesttesttesttesttest"/>
    <Control Grid.Row="1" Grid.ColumnSpan="2" Width="280"/>
</Grid>

在这个示例代码中,我有一个Grid,包含2行和2列。第二列设置为固定宽度。 TextBox已将TextWrapping设置为Wrap

在第二行中,我有Control,其固定宽度高于通常的Grid。这会将第二列的ActualWidth从200增加到约250。

TextBox的实际宽度也会增加,以匹配列的新宽度。

当我现在在文本框的文本框中添加一个长字符串时,它不会使用TextBox的整个宽度,而是包含早期的方式,并在{{{{{{{ 1}}空。

我发现TextBox有一个只读TextBox属性。此属性负责包装。在我的示例中,ExtentWidth的值大约为180,这是从网格列的宽度减去边距和填充的200。

如何修复ExtentWidth

中的换行

编辑:此问题与Looking for explanation for WPF Grid ColumnSpan behavior不重复。 该问题解释了网格列的宽度会发生什么。但它没有回答有关TextBox包装行为的问题。

1 个答案:

答案 0 :(得分:0)

老实说,我不理解“为什么”部分,但在有人提供有意义的解释之前,这里有一些解决方法:

  • TextBox
  • 上设置显式宽度
  • 在列上设置MaxWidth而不是Width
  • TextBox的宽度绑定到同一列中另一个元素的宽度。例如:

    <TextBox Grid.Column="1" Width="{Binding ActualWidth, ElementName=rect}" ... /> <Rectangle Grid.Column="1" x:Name="rect"/>

请注意,如果您需要能够在运行时更改列宽并希望TextBox(和包装)随之更改,则最后一个是唯一可用的解决方法。