Più colori in un'etichetta .NET C #
-
07-07-2019 - |
Domanda
Sto cercando un modo per visualizzare più colori in una singola etichetta C # /. NET. Ad esempio, l'etichetta mostra una serie di valori separati da CSV che ognuno assume un colore a seconda del secchio in cui si trova. Preferirei non usare più etichette, poiché i valori sono di lunghezza variabile e non voglio giocare con layout dinamici. Esiste un supporto nativo per questo?
Soluzione
Non esiste alcun controllo nativo in .NET che lo faccia. La tua scommessa migliore è scrivere il tuo UserControl (chiamalo RainbowLabel o qualcosa del genere). Normalmente avresti un controllo etichetta personalizzato ereditato direttamente da Label, ma poiché non puoi ottenere testo multicolore in un'etichetta, erediteresti semplicemente UserControl.
Per il rendering del testo, UserControl potrebbe dividere il testo in virgole e quindi caricare dinamicamente un'etichetta di colore diverso per ogni blocco. Un modo migliore, tuttavia, sarebbe di rendere il testo direttamente sul tuo UserControl usando i metodi DrawString e MeasureString nello spazio dei nomi Graphics.
Scrivere UserControls in .NET non è davvero difficile, e questo tipo di problema insolito è esattamente ciò a cui sono destinati UserControls personalizzati.
Aggiorna : ecco un semplice metodo che puoi usare per rendere il testo multicolore su un PictureBox:
public void RenderRainbowText(string Text, PictureBox pb)
{
// PictureBox needs an image to draw on
pb.Image = new Bitmap(pb.Width, pb.Height);
using (Graphics g = Graphics.FromImage(pb.Image))
{
// create all-white background for drawing
SolidBrush brush = new SolidBrush(Color.White);
g.FillRectangle(brush, 0, 0,
pb.Image.Width, pb.Image.Height);
// draw comma-delimited elements in multiple colors
string[] chunks = Text.Split(',');
brush = new SolidBrush(Color.Black);
SolidBrush[] brushes = new SolidBrush[] {
new SolidBrush(Color.Red),
new SolidBrush(Color.Green),
new SolidBrush(Color.Blue),
new SolidBrush(Color.Purple) };
float x = 0;
for (int i = 0; i < chunks.Length; i++)
{
// draw text in whatever color
g.DrawString(chunks[i], pb.Font, brushes[i], x, 0);
// measure text and advance x
x += (g.MeasureString(chunks[i], pb.Font)).Width;
// draw the comma back in, in black
if (i < (chunks.Length - 1))
{
g.DrawString(",", pb.Font, brush, x, 0);
x += (g.MeasureString(",", pb.Font)).Width;
}
}
}
}
Ovviamente questo si interromperà se hai più di 4 elementi delimitati da virgole nel tuo testo, ma ottieni l'idea. Inoltre, sembra che ci sia un piccolo difetto in MeasureString che lo fa restituire una larghezza che è un paio di pixel più larga del necessario, quindi la stringa multicolore appare allungata - potresti voler modificare quella parte.
Dovrebbe essere semplice modificare questo codice per un UserControl.
Nota : TextRenderer è una classe migliore da utilizzare per disegnare e misurare stringhe, poiché utilizza ints. Graphics.DrawString e .MeasureString usano i float, quindi otterrai errori off-by-a-pixel qua e là.
Aggiorna : Dimentica sull'uso di TextRenderer. È cane lento.
Altri suggerimenti
Potresti provare a utilizzare un RichTextBox in modo da poter ottenere più colori per la stringa e quindi renderlo di sola lettura e rimuovere il bordo. Cambia il colore di sfondo con lo stesso del modulo su cui è acceso e potresti farcela.
In alternativa, puoi farlo come RTF o HTML in un controllo adatto (come WebBrowser). Probabilmente ci vorrebbe un po 'più risorse che ti piacerebbe idealmente, ma funzionerà abbastanza rapidamente.
Se stai costruendo la tua app Windows per persone con XP e versioni successive, puoi usare WPF. Anche se si tratta di un'app di Windows Form, puoi aggiungere un controllo utente WPF.
Vorrei quindi utilizzare un'etichetta e impostare il "Primo piano" proprietà per essere una sfumatura di colori.
Oppure, in Windows Form (no WPF), potresti semplicemente usare un "Pannello di flusso", quindi in un ciclo for aggiungere più etichette come segmenti del tuo sentimento ... saranno tutti "flusso" insieme come se fosse un'etichetta.
Leggermente fuori tema ... Puoi anche controllare:
Uso spesso etichette colorate per contrassegnare parole chiave di colore rosso, ecc. Come nella risposta di Phil Wright, utilizzo un controllo RichTextBox, rimuovo il bordo e imposto il colore di sfondo su SystemColors.Control.
Per scrivere un testo colorato, il controllo viene prima cancellato e quindi uso questa funzione per aggiungere un testo colorato:
private void rtb_AppendText(Font selfont, Color color, Color bcolor,
string text, RichTextBox box)
{
// append the text to the RichTextBox control
int start = box.TextLength;
box.AppendText(text);
int end = box.TextLength;
// select the new text
box.Select(start, end - start);
// set the attributes of the new text
box.SelectionColor = color;
box.SelectionFont = selfont;
box.SelectionBackColor = bcolor;
// unselect
box.Select(end, 0);
// only required for multi line text to scroll to the end
box.ScrollToCaret();
}
Se vuoi eseguire questa funzione con " mono " quindi aggiungi uno spazio prima di ogni nuovo testo colorato, altrimenti mono non imposterà correttamente il nuovo colore. Ciò non è necessario con .NET
Utilizzo:
myRtb.Text = "";
rtb_AppendText(new Font("Courier New", (float)10),
Color.Red, SystemColors.Control, " my red text", myRtb);
rtb_AppendText(new Font("Courier New", (float)10),
Color.Blue, SystemColors.Control, " followed by blue", myRtb);
Puoi semplicemente usare più etichette. Imposta le proprietà del carattere che desideri e poi usa la sinistra. proprietà top e width per visualizzare le parole da visualizzare diversamente. Questo presuppone che tu stia utilizzando i moduli di Windows.
Prova questo
labelId.Text = "Successfully sent to" + "<a style='color:Blue'> " + name + "</a>";
Non esiste supporto nativo per questo; dovrai utilizzare più etichette o trovare un controllo di terze parti che fornirà questa funzionalità.
Non credo. Dovresti crearne uno tu stesso.
Secondo la tua domanda il tuo requisito è semplice
lable.Text = " Questo colore è rosso "
, quindi deve visualizzare il testo in questo modo
" Il colore è " sarà in blu e "rosso" sarà di colore rosso ..
Questo può essere fatto in questo modo
lable.Text = "<span style='Color:Blue'>" + " The color is " +"</span>" + "<span style='Color:Red'>"Red"</span>"