Permitir TextBox para ser redimensionada, mas não a crescer na entrada do usuário
Pergunta
Eu tenho uma caixa de texto definida dentro de uma janela assim:
<Window x:Class="NS.MainWindow"
...
SizeToContent="WidthAndHeight">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition MinWidth="200" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition MinHeight="50" />
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock>
<TextBox Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow" />
</Grid>
</Window>
O problema é que quando o usuário digita na caixa de texto que se expande para a direita uma vez que apenas o MinWidth está definido. O que eu realmente quero é o texto para embrulhar para a próxima linha. Eu posso fazê-lo fazer isso se eu mudar o MinWidth na coluna a ser Largura vez. No entanto, se eu fizer isso, então o TextBox não redimensionada quando a janela é redimensionada.
Existe uma maneira que eu posso ter os dois? (Ou seja, de redimensionamento apenas em redimensionar a janela, caso contrário embrulhar)
Solução
A razão que você está tendo esse comportamento é porque você definir o propriedade SizeToContent da janela - que basicamente autoriza a janela para redimensionar próprio com base no tamanho solicitado pelo seu conteúdo. Então, como você digitar mais coisas, a caixa de texto diz que eu preciso de mais espaço, a janela obedientemente cresce. Sua caixa de texto não iria crescer se você não definir a propriedade SizeToContent.
Então eu diria que perder a propriedade SizeToContent setter & Use dimensionamento grade proporcional. Aqui eu digo make coluna # 2 duas vezes a largura da coluna # 1. O padrão "Stretch" valor do HorizontalAlignment e VerticalAlignment para a rede deve garantir que seus controles redimensionar corretamente em um redimensionamento da janela.
<Window ...
Title="MyWindow" WindowStyle="ToolWindow" ResizeMode="CanResizeWithGrip"
MinWidth="300" Width="300" Height="80">
<Grid x:Name="myGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" MinWidth="100"/>
<ColumnDefinition Width="2*" MinWidth="200" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition MinHeight="50" />
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock>
<TextBox Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow"/>
</Grid>
Se você acabou de adicionar a volta SizeToContent propriedade setter de trecho de código acima ... você veria algum comportamento estranho em que a caixa de texto cresce inicialmente com conteúdo de texto .. No entanto, se você redimensionar a janela uma vez .. caixa de texto iria parar de crescer . Estranho ... não posso explicar esse comportamento.
HTH
Outras dicas
TextBox do WPF não parece ter essa opção built-in.
Para resolver este problema, você pode usar uma caixa de texto personalizado que relata um (0, 0) tamanho desejado. É um corte feio, mas funciona.
Em seu arquivo MainWindow.xaml.cs:
namespace NS
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
...
}
// Ugly HACK because the regular TextBox doesn't allow autoresize to fit the parent but NOT autoresize when the text doesn't fit.
public class TextBoxThatDoesntResizeWithText : TextBox
{
protected override Size MeasureOverride(Size constraint)
{
return new Size(0, 0);
}
}
}
Então, em seu arquivo MainWindow.xaml:
<Window x:Class="NS.MainWindow"
...
xmlns:local="clr-namespace:NS"
SizeToContent="WidthAndHeight">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition MinWidth="200" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition MinHeight="50" />
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock>
<local:TextBoxThatDoesntResizeWithText Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow" />
</Grid>
</Window>
Alterar o segundo ColumnDefinition ser width = "*".