Permitir TextBox para ser redimensionada, mas não a crescer na entrada do usuário

StackOverflow https://stackoverflow.com/questions/604952

  •  03-07-2019
  •  | 
  •  

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)

Foi útil?

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 = "*".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top