我有一些情况下,我有面板或网格自动调整大小,但如果它们包含一个TextBox与TextWrapping =“Wrap”,TextBox继续扩展的面板/网格到很久以前真正需要,如下图:
我想要做的是让TextBox通过包装文本来填充它的区域,然后再尝试向右扩展.一个简单的例子是:
<Grid> <Grid Background="Black" /> <Grid VerticalAlignment="Top" HorizontalAlignment="Left" Background="White"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"></ColumnDefinition> </Grid.ColumnDefinitions> <TextBox TextWrapping="Wrap" Height="120" MinWidth="200" /> </Grid> </Grid>
我在SO here上发现了一个类似的问题,但是发布的最佳解决方案不允许TextBox扩展.那个解决方案就像:
<Grid> <Grid Background="Black"> </Grid> <Grid VerticalAlignment="Top" HorizontalAlignment="Left" Background="White"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"></ColumnDefinition> </Grid.ColumnDefinitions> <Border BorderThickness="0" x:Name="border" Margin="0.5" /> <TextBox TextWrapping="Wrap" Height="120" MinWidth="200" Width="{Binding ActualWidth,ElementName=border}" /> </Grid> </Grid>
解决方法
虽然我不建议这样做,因为我认为这会给用户带来意想不到的行为,这似乎实现了你所要求的:
XAML:
< TextBox ... MinHeight =“120”Width =“200”SizeChanged =“TextBox_SizeChanged”/>
代码背后:
private void TextBox_SizeChanged(object sender,SizeChangedEventArgs e) { try { if (e.PrevIoUsSize == Size.Parse("0,0")) return; if (e.PrevIoUsSize == e.NewSize) return; if (e.HeightChanged) { ((TextBox)sender).Width = e.PrevIoUsSize.Width + 20; } } finally { e.Handled = true; } }
需要注意的几件事情,1)为了使其工作,您必须同时使用MinHeight和Width来扩展,2)20的水平扩展只是我用于测试目的的任意值;你会想出一种更可靠的计算变量扩展值的方法.