2011-11-08 2 views
20

Sto scrivendo un programma in cui l'utente dovrebbe essere in grado di scrivere del testo in una casella di testo. Mi piacerebbe che la casella di testo si ridimensionasse, quindi si adattava al contenuto. Ho provato la seguente:C# Ridimensiona la casella di testo per adattarla al contenuto

private void textBoxTitle_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    System.Drawing.Font myFont = new System.Drawing.Font("Verdana", 8); 
    System.Drawing.SizeF mySize = e.Graphics.MeasureString("This is a test", myFont); 
    this.textBoxTitle.Width = (int)Math.Round(mySize.Width, 0); 
} 

ottengo un errore che dice che la grafica non funziona per TextChangedEventArgs. C'è un altro modo in cui posso ridimensionare la casella di testo?

+0

Stai usando .NET 1? –

+0

stai provando questo in silverlight? –

risposta

48

Dovresti provare un codice come in basso. Ha funzionato bene per me.

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    Size size = TextRenderer.MeasureText(textBox1.Text, textBox1.Font); 
    textBox1.Width = size.Width; 
    textBox1.Height = size.Height; 
} 

Per ulteriori informazioni fare riferimento a TextRenderer.MeasureText()

+0

Ho usercontrol che ha un TextBox all'interno. Quando il testo cresce molto, solo la larghezza aumenterà, anche la larghezza verrà superata dal suo genitore. Come determinare la larghezza del genitore, quindi avvolgere il testo e aumentare l'altezza? –

1

Sarà necessario utilizzare il metodo della forma CreateGraphics() per creare l'istanza Graphics per misurare la stringa su.

La classe TextChangedEventArgs non ha una proprietà Graphics, che è una proprietà della classe PaintEventArgs passata al gestore Paint eventi

1

Prova questo:

using System.Drawing; 
... 

private void textBoxTitle_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    // Determine the correct size for the text box based on its text length 

    // get the current text box safely 
    TextBox tb = sender as TextBox; 
    if (tb == null) return; 

    SizeF stringSize; 

    // create a graphics object for this form 
    using(Graphics gfx = this.CreateGraphics()) 
    { 
     // Get the size given the string and the font 
     stringSize = gfx.MeasureString(tb.Text, tb.Font); 
    } 

    // Resize the textbox 
    tb.Width = (int)Math.Round(stringSize.Width, 0); 

} 

In sostanza si crea il proprio Graphics oggetto per il modulo, quindi misurarlo in base al testo e al carattere del TextBox. Lo using smaltirà correttamente l'oggetto Graphics - il codice precedente sarebbe trapelato in modo orribile!

2

L'associazione all'evento errato e non è possibile utilizzare l'oggetto grafico nell'oggetto TextChangedEventArgs.

Provare a utilizzare l'evento TextChanged. Il seguente frammento sta lavorando:

public Form1() 
{ 
    InitializeComponent(); 

    this.textBox1.TextChanged += new EventHandler(textBox1_TextChanged); 
} 

void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    System.Drawing.SizeF mySize = new System.Drawing.SizeF(); 

    // Use the textbox font 
    System.Drawing.Font myFont = textBox1.Font; 

    using (Graphics g = this.CreateGraphics()) 
    { 
     // Get the size given the string and the font 
     mySize = g.MeasureString(textBox1.Text, myFont); 
    } 

    // Resize the textbox 
    this.textBox1.Width = (int)Math.Round(mySize.Width, 0); 
} 

}

0

hai cercato di impostare yourTextBox.AutoSize = true;? Questa proprietà potrebbe essere nascosta nella finestra di progettazione della GUI, ma è possibile impostarla nel costruttore di moduli subito dopo la chiamata InitializeComponent();.

0

stringa Graphics.Measure si può fare o PaintEventArgs, non su TextChangedEventArgs

Quello che penso che vuoi è questo

System.Drawing.Font myFont = new System.Drawing.Font("Verdana", 8); 
Graphics graphics = this.CreateGraphics(); 
SizeF textSize = graphics.MeasureString("This is a test", myFont); 

Il problema è che non si può creare un Graphics oggetto semplicemente assegnandolo poiché non ha un costruttore pubblico, quindi è meglio andare e utilizzare TextRenderer.MeasureText, come fatto in http://msdn.microsoft.com/en-us/library/y4xdbe66.aspx

TextRenderer è meno preciso perché utilizza GDI e Graphics utilizza GDI +, quindi forse dovresti lasciare un piccolo margine sul valore che ottieni dalla proprietà Width.

Spero che questo aiuti

0

Qualunque sia lo scopo è.

Se la dimensione della casella di testo deve essere impostata dinamicamente in base alla stringa, che dovrebbe essere il testo all'interno di questa casella, non è disponibile l'opzione.

Motivi: MeasureString utilizza i normali formati di stringa come delimitatori per la propria larghezza e altezza. Vengono analizzati anche i mezzi, il ritorno a capo e l'avanzamento riga. Risultante in una taglia. Larghezza e dimensioni. Altezza.

A seconda della stringa (e del relativo carattere e numero di righe) queste due variabili possono contenere valori, che a volte sono inutili da utilizzare come valori di larghezza/altezza di una casella di testo (perché possono essere più grandi dei valori della scheda madre e questo ridimensionerebbe la casella di testo in una dimensione, con i bordi sinistro e inferiore oltre quelli del modello principale).

Alcune soluzioni sono ancora disponibili, a seconda dell'obiettivo che si vorrebbe raggiungere.

Un'idea potrebbe essere: Creare una casella di testo nella finestra di progettazione, dimensione = 100 X 100. abilitare il wrapping delle parole.

Nel OnTextChanged gestore di eventi della casella di testo, abbiamo appena ridimensionare la larghezza della casella di testo per un valore, definito da noi stessi (per esempio parentform.Width o un altro valore duro).

questo potrebbe causare il ritorno a capo automatico per ricalcolare la stringa nella casella di testo e questo sarebbe riorganizzare tutti i personaggi all'interno della casella di testo, in quanto a capo automatico è abilitato.

L'altezza della casella di testo potrebbe essere impostata su parentform.Height, ad esempio.

MA, meglio: impostare l'altezza dinamicamente, in base al valore Y del ReturnValue (punto) del metodo texbox.GetPositionFromCharIndex (textbox.TextLength -1). Quindi, con Math.Min() determinare, che è più piccolo (o parentform.Height o Point.Y) e reimpostare la dimensione della casella di testo su nuova dimensione (precedenteDeterminedWidth, nowDeterminedHeight).

Si prega di tenere presente (se le barre di scorrimento sono abilitate) per aggiungere circa 17 pixel al calcolo della larghezza.

migliori saluti

2

sto aggiungendo questa risposta come non vedo l'aspetto fixed width di una casella di testo in discussione in uno qualsiasi degli altri. Se hai una larghezza fissa per la tua casella di testo e vuoi regolare solo la sua altezza puoi fare qualcosa come la seguente:

Qualcosa di simile dà l'altezza del testo come viene disegnato nella casella di testo multilinea con wordwrapped :

SizeF MessageSize = MyTextBoxControl.CreateGraphics() 
           .MeasureString(MyTextBoxControl.Text, 
               MyTextBoxControl.Font, 
               MyTextBoxControl.Width, 
               new StringFormat(0)); 

io non sono sicuro di quello che dovrebbe essere StringFormat ma i valori StringFormatFlags non sembrano applicarsi a un default TextBox compongono.

Ora con MessageSize.Height si conosce l'altezza del testo nella casella di testo.

1

Ho avuto lo stesso problema e l'ho risolto in un modo più semplice.

Ho utilizzato la proprietà AutoSize di un controllo Label .. Ho aggiunto un'etichetta invisibile al mio modulo, impostando la proprietà AutoSize True. Quando l'ho bisogno di cambiare le dimensioni del mio TextBox io uso questo codice:

MyLabel.Text = MyTextBox.Text; 
MyTextBox.Size = MyLabel.Size; 

ho impostato la massima e minima dimensione dell'etichetta per ottenere risultati migliori. Divertiti