2010-05-14 4 views
6

Mi chiedevo come fare per consentire all'utente di ridimensionare un controllo TextBox in fase di esecuzione trascinando gli angoli in WPF. Meno importante, è la stessa tecnica utilizzata per il ridimensionamento di tutti i controlli?Ridimensionamento di TextBox in fase di esecuzione in WPF

Grazie :)

+0

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

+2

Questo non dovrebbe essere contrassegnato come duplicato poiché nulla su quel link funziona. –

risposta

6

Si dovrebbe provare ad impostare allineamenti della casella di testo per allungare e collocandolo all'interno di un contenitore che è possibile ridimensionare, come una griglia con gridsplitters (o in una finestra ridimensionabile). È molto più semplice che provare a creare una casella di testo ridimensionabile personalizzata e funzionerà meglio con il resto del layout.

EDIT: Ecco un esempio da una vera e propria app: risposta

<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

È possibile che questo non sia perfetto per il tuo caso, ma dovrebbe essere la prima cosa che consideri. –

+0

Interessante, lo sto provando ora! :-) +1 –

6

di tehMick è assolutamente corretto: Si dovrebbe creare un contenitore per fare il ridimensionamento piuttosto che la personalizzazione del controllo TextBox in sé. E se funziona per te, GridSplitter è un'ottima soluzione in-the-box.

Avevo la stessa situazione ma GridSplitter non funzionava, quindi ho creato un controllo "ResizeBorder" che gestiva il trascinamento del mouse sui suoi quattro angoli per ridimensionarlo in due dimensioni, o il centro dei lati per ridimensionarlo in uno. Questo è in realtà un codice molto semplice: basta gestire MouseDown, impostare una variabile locale che fornisce la posizione MouseDown e il lato/angolo trascinato, quindi MouseMove aggiorna la dimensione.

My ResizeBorder era stylable in modo da poter mostrare solo quattro scatole agli angoli e le linee sui lati, o qualcosa di più complesso che potessi immaginare.

Si noti inoltre che se si sta utilizzando una griglia e GridSplitters o un ResizeBorder o qualsiasi altra cosa, si ha la scelta di mettere la funzionalità di ridimensionamento sia intorno al controllo in questo modo:

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

o l'aggiornamento del ControlTemplate per TextBox sé:

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

... 

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

I vantaggi di questo secondo metodo sono che è possibile utilizzare uno stile o proprietà associata a fare maggio TextBoxes ridimensionabile e che ca n cambia facilmente la ridimensionabilità del TextBox in modo dinamico nel codice.

+0

Queste sono buone opzioni +1 –