2008-12-22 11 views
11

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. Soy la creación de contenido de la ventana al siguiente códigoWPF TextBox y Comportamiento de desplazamiento

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

Todos funcionan bien, pero cuando los tipos de usuario de texto muy largo en el cuadro de texto que se está ampliando y aparece de 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.

Respuesta

31

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 a este problema es hacer que otro elemento de auto-size y obligar a la TextBox.Width a ella:

<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 tamaño automático (la frontera). Esto es importante porque si no se establece, habrá un bucle:

  1. autosizes ancho del borde a ancho de columna de cuadrícula
  2. anchura TextBox cambia de tamaño para Border.ActualWidth
  3. cuadrícula ancho de la columna cambia el tamaño de la anchura TextBox + margen TextBox
  4. ancho del borde autosizes a la red ancho de columna de nuevo

ajustando el margen para el mismo que el cuadro de texto, el cambio de tamaño de la TextBox no afectará a la Gri d tamaño

+0

Gracias ... eso es genial! – Jose

+1

Después de retocar el código basado en la solución de Robert, me pareció útil enlazar el MaxWidth de un cuadro de texto con el elemento circundante. Parece evitar problemas con bucles de tamaño infinito para algunas aplicaciones. – estanford

+3

Funciona bien, pero ahora el TextBox se mantiene en su gran tamaño cuando la ventana se hace más pequeña. ¿Alguna solución para eso? – Heinzi

0

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

2

Anulación TextBox.MeasureOverride al igual que funcionó para mí:

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

¿Y cómo se vincula MinWidth a la columna adjunta? –