2010-05-14 16 views
6

Me preguntaba cómo iba a permitir que el usuario cambie el tamaño de un control TextBox en tiempo de ejecución arrastrando sus esquinas en WPF. Menos importante, ¿es la misma técnica utilizada para cambiar el tamaño de todos los controles?Redimensionar TextBox En Runtime en WPF

Gracias :)

+0

Duplicado: http://stackoverflow.com/questions/771275/resizing-a-control-in-wpf – Heinzi

+2

Esto no debe marcarse como duplicado ya que no funciona nada en ese enlace. –

Respuesta

6

Usted debe tratar de establecer las alineaciones de la caja de texto para estirar y la coloque en un recipiente que se puede cambiar el tamaño, como una cuadrícula con gridsplitters (o en una ventana de tamaño variable). Es mucho más fácil que tratar de crear un cuadro de texto de tamaño personalizado, y funcionará mejor con el resto de su diseño.

EDIT: He aquí un ejemplo de una aplicación real: respuesta

<Grid>... 
<GridSplitter Grid.Row="1" Grid.ColumnSpan="2" ResizeDirection="Rows" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Height="4" BorderThickness="0,0,0,1" BorderBrush="Gray" Background="Transparent"/> 
<TextBox Grid.Row="2" Grid.Column="0" Margin="6,6,6,6" Name="RequestTextBox" VerticalScrollBarVisibility="Auto" TextWrapping="Wrap" Text="{Binding Request, Mode=TwoWay}"/> 
<GridSplitter Grid.Row="2" Grid.ColumnSpan="2" ResizeDirection="Rows" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Height="4" BorderThickness="0,0,0,1" BorderBrush="Gray" Background="Transparent"/> 
...</Grid> 
+0

Es posible que esto no sea perfecto para su caso, pero debería ser lo primero que considere. –

+0

¡Interesante, estoy tratando de hacerlo ahora! :-) +1 –

6

de tehMick es absolutamente correcta: Definitivamente, usted debe crear un recipiente para hacer el cambio de tamaño en lugar de personalizar el cuadro de texto en sí. Y si funciona para usted GridSplitter es una muy buena solución en la caja.

Tuve la misma situación pero GridSplitter no funcionaría, así que creé un control "ResizeBorder" que manejaba el mouse arrastra en sus cuatro esquinas para cambiar el tamaño en dos dimensiones, o en el medio de los lados para cambiar el tamaño en uno. Este es en realidad un código muy simple: simplemente maneje MouseDown, establezca una variable local que proporcione la ubicación MouseDown y el lado/esquina que se está arrastrando, luego en MouseMove actualice el tamaño.

Mi ResizeBorder fue diseñado para que yo pudiera mostrar solo cuatro cajas en las esquinas y líneas a los lados, o cualquier cosa más compleja que pudiera soñar.

Además, tenga en cuenta que si está utilizando una cuadrícula y GridSplitters o una ResizeBorder o cualquier otra cosa, usted tiene la opción de poner su funcionalidad de cambio de tamaño ya sea todo el control de la siguiente manera:

<my:ResizeBorder ...> 
    <TextBox ... /> 
</my:ResizeBorder> 

o la actualización del cuadro de texto para ControlTemplate sí:

<ControlTemplate x:Key="ResizableTextBox" TargetType="{x:Type TextBox}"> 
    <my:ResizeBorder> 
    ... 
    </my:ResizeBorder> 
</ControlTemplate> 

... 

<TextBox Template="{StaticResource ResizableTextBoxTemplate}" ... /> 

las ventajas de este último método es que se puede utilizar un estilo o propiedad adjunta para hacer cuadros de texto puede cambiar de tamaño y que ca n fácilmente cambia la resitibilidad del TextBox de forma dinámica en el código.

+0

Esas son buenas opciones +1 –