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?

È stato utile?

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.

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>"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top