C # Ridimensiona la casella di testo per adattarla al contenuto

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 il seguente:

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 dicendo che la grafica non funziona per TextChangedEventArgs. C’è un altro modo in cui posso ridimensionare la casella di testo?

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

Sto aggiungendo questa risposta perché non vedo l’aspetto della fixed width di una casella di testo discussa in una delle altre. Se hai una larghezza fissa per la tua casella di testo e vuoi regolare solo la sua altezza puoi fare qualcosa di simile al seguente:

Qualcosa di simile dà l’altezza del testo come viene disegnato nella casella di testo multilinea wordpressa stessa:

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

Non sono sicuro di cosa debba essere StringFormat ma i valori StringFormatFlags non sembrano applicabili a un make-up TextBox predefinito.

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

L’associazione all’evento sbagliato e non è ansible utilizzare l’object grafico nell’object TextChangedEventArgs .

Prova a utilizzare l’evento TextChanged. Il seguente frammento funziona:

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

}

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

Ho usato la proprietà AutoSize di un controllo Label .. Ho aggiunto un’etichetta invisibile al mio modulo, impostando la sua proprietà AutoSize True. Quando ho bisogno di cambiare la dimensione del mio TextBox uso questo codice:

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

Ho impostato la dimensione massima e minima dell’etichetta per ottenere risultati migliori. Divertiti

Sarà necessario utilizzare il metodo CreateGraphics () del modulo per creare l’istanza Graphics per misurare la stringa.

La class TextChangedEventArgs non ha una proprietà Graphics , ovvero una proprietà della class PaintEventArgs al gestore eventi Paint

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 object Graphics per il modulo, quindi lo si misura in base al testo e al tipo di carattere del TextBox. L’ using disporrà correttamente dell’object Graphics – il codice precedente sarebbe trapelato orribilmente!

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

Graphics.Misura stringa che puoi fare o PaintEventArgs , non su TextChangedEventArgs

Quello che penso che tu voglia è 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 è ansible creare un object Graphics semplicemente assegnandolo poiché non ha un costruttore pubblico, quindi è meglio andare e usare TextRenderer.MeasureText, come fatto in http://msdn.microsoft.com/en-us/ biblioteca / y4xdbe66.aspx

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

Spero che questo ti aiuti

Qualunque sia l’objective.

Se la dimensione della casella di testo deve essere impostata dynamicmente in base alla stringa, che dovrebbe essere il testo all’interno di questa casella, non c’è una buona opzione .

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

A seconda della stringa (e del suo carattere e numero di righe) queste due variabili possono contenere valori, che a volte sono inutili per essere usati come valori di larghezza / altezza di una casella di testo (perché possono essere più grandi dei valori della genitrice e ridimensionare casella di testo in una dimensione, con i bordi sinistro e inferiore oltre quelli della forma padre ).

Alcune soluzioni sono ancora disponibili, a seconda dell’objective 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 gestore di eventi OnTextChanged della casella di testo, ridimensioniamo la larghezza della casella di testo a un valore, definito da noi stessi (ad esempio parentform.Width o un altro valore elevato).

Ciò causerebbe il ricapitolazione della parola per ricalcolare la stringa nella casella di testo e ciò riorganizzerebbe tutti i caratteri all’interno della casella di testo, poiché il ritorno a capo automatico è abilitato.

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

MA, meglio: imposta dynamicmente l’altezza, 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 in nuova dimensione (previousDeterminedWidth, nowDeterminedHeight).

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

I migliori saluti