webentwicklung-frage-antwort-db.com.de

Mehrere Farben in einem C # .NET-Label

Ich suche nach einer Möglichkeit, mehrere Farben in einem einzigen C # /. NET-Label anzuzeigen. Zum Beispiel zeigt das Etikett eine Reihe von csv-getrennten Werten an, die jeweils eine Farbe annehmen. Ich möchte lieber nicht mehrere Labels verwenden, da die Werte variabel sind und ich nicht mit dynamischen Layouts spielen möchte. Gibt es eine native Unterstützung dafür?

34
Cory

Es gibt kein natives Steuerelement in .NET, das dies tut. Am besten schreiben Sie Ihr eigenes UserControl (nennen Sie es RainbowLabel oder so). Normalerweise haben Sie ein benutzerdefiniertes Label-Steuerelement, das direkt von Label geerbt wird. Da Sie jedoch keinen mehrfarbigen Text in einem Label erhalten können, erben Sie nur von UserControl.

Zum Rendern des Texts könnte Ihr UserControl den Text in Kommas teilen und dann dynamisch ein andersfarbiges Label für jeden Block laden. Besser ist es jedoch, den Text mithilfe der DrawString- und MeasureString-Methoden im Graphics-Namespace direkt auf Ihr UserControl zu rendern.

Das Schreiben von UserControls in .NET ist wirklich nicht schwierig, und diese Art von ungewöhnlichem Problem ist genau das, wofür benutzerdefinierte UserControls sind.

Update : Hier ist eine einfache Methode, mit der Sie den mehrfarbigen Text in einer PictureBox rendern können:

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

Offensichtlich wird das kaputt gehen, wenn Sie mehr als 4 durch Kommas getrennte Elemente in Ihrem Text haben, aber Sie haben die Idee. Es scheint auch, dass ein kleiner Fehler in MeasureString vorhanden ist, der dazu führt, dass eine Breite entsteht, die einige Pixel breiter als nötig ist. Die mehrfarbige Zeichenfolge erscheint also gestreckt - Sie möchten diesen Teil vielleicht optimieren.

Es sollte einfach sein, diesen Code für ein UserControl zu ändern.

Hinweis : TextRenderer ist eine bessere Klasse zum Zeichnen und Messen von Strings, da er ints verwendet. Graphics.DrawString und .MeasureString verwenden Floats, sodass hier und da Fehler auftreten, die um einen Pixel voneinander abweichen.

Update : Vergessen Sie über die Verwendung von TextRenderer. Es ist Hund langsam.

42
MusiGenesis

Sie können versuchen, eine RichTextBox zu verwenden, um mehrere Farben für die Zeichenfolge zu erhalten und sie dann schreibgeschützt zu machen und den Rand zu entfernen. Ändern Sie die Hintergrundfarbe genauso wie das Formular, auf dem sie sich befindet, und Sie könnten damit durchkommen.

14
Phil Wright

Alternativ können Sie dies als RTF oder HTML in einem geeigneten Steuerelement (z. B. WebBrowser) tun. Es würde wahrscheinlich etwas mehr Ressourcen erfordern, die Sie idealerweise mögen würden, aber es wird ziemlich schnell funktionieren.

4
Marc Gravell

Wenn Sie Ihre Windows-App für Personen ab XP erstellen, können Sie WPF verwenden. Auch wenn es sich um eine Windows Forms-App handelt, können Sie ein WPF-Benutzersteuerelement hinzufügen.

Ich würde dann ein Label verwenden und die "Foreground" -Eigenschaft auf einen Farbverlauf setzen.

Oder Sie könnten in Windows Forms (ohne WPF) einfach ein "Flow Panel" verwenden, und dann fügen Sie in einer for-Schleife mehrere Labels als Segmente Ihrer Urteilsform hinzu ... Sie werden alle "zusammenfließen", als ob es ein Label wäre .

4
Timothy Khouri

Etwas außerhalb des Themas ... Sie könnten auch prüfen: 

1
Yordan Georgiev

Ich verwende häufig farbige Beschriftungen, um Schlüsselwörter in roter Farbe usw. zu markieren. Wie in der Antwort von Phil Wright verwende ich ein RichTextBox-Steuerelement, entferne den Rahmen und setze die Hintergrundfarbe auf SystemColors.Control.

Um farbigen Text zu schreiben, wird das Steuerelement zuerst gelöscht, und dann füge ich mit dieser Funktion farbigen Text hinzu:

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

Wenn Sie diese Funktion mit "Mono" ausführen möchten, fügen Sie vor jedem neuen farbigen Text ein Leerzeichen ein. Andernfalls wird die Farbe nicht korrekt eingestellt. Dies ist bei .NET nicht erforderlich

Verwendungszweck:

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);
0
harry4516

Versuche dies, 

   labelId.Text = "Successfully sent to" + "<a style='color:Blue'> "  + name + "</a>"; 
0
Padmaja Vudatha

Sie können einfach mehrere Etiketten verwenden. Stellen Sie die gewünschten Schrifteigenschaften ein und verwenden Sie dann die linke. top- und width-Eigenschaften, um die Wörter anzuzeigen, die unterschiedlich angezeigt werden sollen. Dies setzt voraus, dass Sie Windows-Formulare verwenden.

0
Chris Wegener