我最近经历过一个奇怪的文本框行为。
<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包装行为的问题。
答案 0 :(得分:0)
老实说,我不理解“为什么”部分,但在有人提供有意义的解释之前,这里有一些解决方法:
TextBox
MaxWidth
而不是Width
将TextBox
的宽度绑定到同一列中另一个元素的宽度。例如:
<TextBox Grid.Column="1" Width="{Binding ActualWidth, ElementName=rect}" ... />
<Rectangle Grid.Column="1" x:Name="rect"/>
请注意,如果您需要能够在运行时更改列宽并希望TextBox(和包装)随之更改,则最后一个是唯一可用的解决方法。