2011-10-13 12 views
41

È possibile evidenziare/selezionare parte del testo in un controllo etichetta Windows Form? So che è possibile con il controllo RTFtextbox ma che l'utilizzo di tale controllo sarebbe eccessivo dato che ho bisogno di creare molte istanze dell'etichetta.È possibile selezionare il testo su un'etichetta di modulo Windows?

+1

Cosa si intende per "selezionare"? Vuoi dire selezionarlo per codice, per usare questo testo dopo? – GianT971

+1

scusa @ Giovanni ... per selezione intendo la selezione del testo, ad es. in RichTextBox puoi usare proprietà "SelectedText" ecc per selezionare/evidenziare una porzione dell'intero testo. L'effetto è simile alla selezione/evidenziazione del testo manualmente con il mouse. – tunafish24

+2

Solo un'idea: potresti creare una classe derivata da Label in cui hai alcune proprietà per memorizzare l'indice di inizio e fine del testo da selezionare, quindi sovrascrivere l'evento onPaint puoi evidenziare il testo disegnando un rettangolo semitrasparente su di esso – Marco

risposta

67

È possibile selezionare il testo su un'etichetta di modulo Windows? - NO (Almeno nessun modo semplice, senza sovrascrivere il metodo Label.Paint)

È possibile modificare facilmente un TextBox per questo scopo.

TextBox1.Text = "Hello, Select Me"; 
TextBox1.ReadOnly = true; 
TextBox1.BorderStyle = 0; 
TextBox1.BackColor = this.BackColor; 
TextBox1.TabStop = false; 

Non crederci? ecco un esempio per te.

enter image description here

+7

Il problema che potresti incontrare è se stai impostando il testo della texbox in modo dinamico, il quale nasconderà il testo se è più largo della casella di testo, a differenza dell'etichetta. –

+2

@TheMuffinMan devi impostare la proprietà «WordWrap» su «true». –

+1

Se necessario, è anche possibile impostare Multiline = True per poter modificare l'altezza del TextBox. –

7

No, non è possibile selezionare il testo sull'etichetta di Windows Form. Puoi invece usare una casella di testo di sola lettura per questo.

5

Utilizzare un TextBox con BorderStyle set per None e Readonly insieme a true e Backcolor a corrispondere a quello del contenitore.

3

Non è possibile evidenziare parte del testo su un'etichetta. Tuttavia, è possibile utilizzare un'immagine e impostarla sulla proprietà Label.Image se il testo di queste etichette è statico.

+1

sarà davvero difficile da implementare, inoltre il testo è dinamico - ecco perché è necessario evidenziarne alcuni. – tunafish24

11

Come Bala R rispose:

"Utilizzare un TextBox con BorderStyle impostata su None e sola lettura impostata su true e Backcolor a corrispondere a quello del contenitore.".

Se la stringa di testo è molto lungo, e il Width del TextBox non è sufficiente per visualizzare tutto il testo, quindi è possibile impostare la proprietà Width del TextBox per visualizzare tutti è Testo.

Se è necessario conoscere il numero corretto per Width, è possibile utilizzare il metodo MeasureString di Graphics per questo. È possibile ottenere l'istanza dal metodo CreateGraphics() dello Control (TextBox in questo caso).

Il primo parametro è TextBox Text e il secondo parametro è Font di TextBox. Questa funzione restituisce la struttura SizeF. È necessaria solo la proprietà Width di esso, convertirlo in numero intero con (int)size.Width o (int)Math.Round(size.Width).

Non dimenticare di chiamare il metodo Dispose() dell'istanza grafica dopo, perché non ne avrai più bisogno.


È possibile scrivere la propria funzione che farà tutto questo processo:

static void SetText(TextBox textBox, string str) 
{ 
    Graphics graphics = textBox.CreateGraphics(); 
    SizeF size = graphics.MeasureString(str, textBox.Font); 
    graphics.Dispose(); 
    textBox.Width = (int)Math.Round(size.Width); 
    textBox.Text = str; 
} 
+1

Se si dispone di una casella di testo a larghezza fissa che si desidera ridimensionare con questo codice, vedere questa domanda: https://stackoverflow.com/questions/29299297/measure-text-height-wrapped-in-a- specificato larghezza – QuickDanger

Problemi correlati