Permitir que TextBox cambie de tamaño pero no crezca en la entrada del usuario

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Tengo un TextBox definido dentro de una ventana, así:

<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>

El problema es que cuando el usuario escribe en el TextBox, se expande a la derecha, ya que solo se establece el MinWidth. Lo que realmente quiero es que el texto se ajuste a la siguiente línea. Puedo hacer que haga esto si cambio el Minwidth en la columna para que sea Width en su lugar. Sin embargo, si hago esto, el TextBox ya no cambia de tamaño cuando se cambia el tamaño de la ventana.

¿Hay alguna manera de tener ambos? (es decir, cambiar el tamaño solo en el tamaño de la ventana, de lo contrario envolver)

¿Fue útil?

Solución

La razón por la que está teniendo este comportamiento es porque configuró la propiedad SizeToContent de la ventana , que básicamente autoriza a la ventana a redimensionarse en función del tamaño solicitado por su contenido. Entonces a medida que escribes más cosas, el cuadro de texto dice que necesito más espacio, la ventana crece obedientemente. Su cuadro de texto no crecería si no establece la propiedad SizeToContent.

Por lo tanto, diría que se pierde el configurador de propiedades SizeToContent & amp; Utilizar tamaño de cuadrícula proporcional. Aquí digo que la Columna # 2 es el doble del ancho de la Columna # 1. El valor predeterminado " Estirar " el valor de HorizontalAlignment y VerticalAlignment para la cuadrícula debe garantizar que los controles cambien de tamaño correctamente en el tamaño de una ventana.

<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>

Si solo agrega el configurador de propiedades SizeToContent al fragmento de código anterior ... vería un comportamiento extraño en el que el cuadro de texto crece inicialmente con el contenido del texto ... sin embargo, si cambia el tamaño de la ventana una vez ... el cuadro de texto dejará de crecer . Extraño ... no puedo explicar ese comportamiento.
HTH

Otros consejos

El TextBox de WPF no parece tener esa opción integrada.

Para resolver este problema, puede usar un TextBox personalizado que informe el tamaño deseado (0, 0). Es un truco feo, pero funciona.

En su archivo 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);
        }
    }
}

Luego, en tu archivo 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>

Cambia la segunda definición de columna para que sea Width = " * " ;.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top