wpf controls panels

WPF TextBox y comportamiento de desplazamiento



stackpanel wpf (3)

El problema es que los elementos principales proporcionan a TextBox tanto espacio como cree que necesita, y cuando hay más texto, se expandirá en lugar de permanecer en el tamaño automático inicial.

Una solución aquí es crear otro elemento de tamaño automático y vincular TextBox.Width a él:

<DockPanel> <TreeView Width="150" DockPanel.Dock="Left"/> <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBlock Margin="5" VerticalAlignment="Center" Text="Name"/> <Border x:Name="b" Grid.Column="1" Margin="5"/> <TextBox Width="{Binding ActualWidth, ElementName=b}" MinWidth="200" Grid.Column="1" Margin="5" VerticalAlignment="Center" Text="Some Name"/> </Grid> </ScrollViewer> </DockPanel>

Tenga en cuenta que establecemos la propiedad Margen del elemento de ajuste automático (el Borde). Esto es importante porque si no está configurado, habrá un ciclo:

  1. Ancho del borde de forma automática al ancho de la columna Cuadrícula
  2. El ancho del cuadro de texto cambia a Border.ActualWidth
  3. El ancho de la columna de cuadrícula cambia a TextBox width + TextBox margin
  4. El ancho del borde vuelve a formatear automáticamente en el ancho de la columna Cuadrícula

Al establecer el margen al mismo que el cuadro de texto, el cambio de tamaño del cuadro de texto no afectará el tamaño de la cuadrícula.

Tengo un problema. Necesito alojar la cuadrícula con los controles en ScrollViewer para evitar que el cuadro de texto se trunque o se contraiga a cero en la interfaz de usuario. También quiero que se expanda el cuadro de texto cuando el usuario cambie el ancho de las ventanas. Estoy configurando el contenido de Windows con el siguiente código

<DockPanel> <TreeView DockPanel.Dock="Left" Width="150"/> <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBlock Text="Name" Margin="5" VerticalAlignment="Center"/> <TextBox Grid.Column="1" Text="Some Name" Margin="5" VerticalAlignment="Center" MinWidth="200"/> </Grid> </ScrollViewer> </DockPanel>

Todo funciona bien, pero cuando el usuario escribe texto muy largo en TextBox, se está expandiendo y aparece desplazamiento horizontal. ¿Hay alguna manera fácil de limitar el ancho máximo de TextBox y permitir que se expanda solo cuando el usuario cambia el tamaño de la ventana.


no, este es un problema bien conocido de wpf y se espera que se solucione en la próxima versión. Gracias


TextBox.MeasureOverride como me funcionó a mí:

protected override Size MeasureOverride(Size constraint) { Size origSize = base.MeasureOverride(constraint); origSize.Width = MinWidth; return origSize; }