2009-03-03 8 views
12

Ho una TextBox definito all'interno di una finestra in questo modo:Lasciare TextBox a essere ridimensionato ma non crescere su input dell'utente

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

Il problema è che quando l'utente nella casella di testo si espande verso destra dal solo la MinWidth è impostata. Quello che voglio veramente è che il testo si sposti alla riga successiva. Posso farlo per farlo se cambio il MinWidth sulla colonna per essere invece Larghezza. Tuttavia, se lo faccio, il TextBox non si ridimensiona più quando la finestra viene ridimensionata.

C'è un modo in cui posso averli entrambi? (Ad esempio, ridimensionare solo in Ridimensionamento finestra, altrimenti avvolgere)

risposta

15

Il motivo per cui si sta verificando questo comportamento è dovuto al fatto che è stata impostata la proprietà SizeToContent della finestra, che consente in sostanza alla finestra di ridimensionarsi in base alle dimensioni richieste dal suo contenuto. Così, mentre digiti più cose, la casella di testo dice che ho bisogno di più spazio, la finestra cresce obbedientemente. La tua casella di testo non crescerà se non imposti la proprietà SizeToContent.

Quindi direi perdere il setter SizeToContent & Utilizzare il dimensionamento griglia proporzionale. Qui dico di rendere Column # 2 due volte la larghezza di Column # 1. Il valore predefinito "Allunga" di HorizontalAlignment e VerticalAlignment per la griglia dovrebbe garantire che i controlli ridimensionino correttamente in un ridimensionamento della finestra.

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

Se si aggiunge solo il setter di proprietà SizeToContent ritorna al frammento di codice di cui sopra ... che ci si vede qualche comportamento strano in cui la casella di testo si sviluppa inizialmente con il contenuto del testo .. se si ridimensiona la finestra, una volta .. il la casella di testo smetterebbe di crescere. Strano ... non può spiegare quel comportamento.
HTH

0

Modificare il secondo ColumnDefinition in Width = "*".

+1

Questo sarà ancora crescere la casella di testo. Usare * implica - usa il resto della larghezza disponibile per la colonna # 2 – Gishu

3

Il TextBox di WPF non sembra avere quell'opzione integrata.

Per risolvere questo problema, è possibile utilizzare un TextBox personalizzato che riporta una dimensione desiderata (0, 0). È un brutto trucco, ma funziona.

Nel file 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); 
     } 
    } 
} 

Poi, nel file 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>