Frage

Ich bin auf der Suche nach einem Weg, um mehrere Farben in einem einzigen C# -/.NET-label.E. g das Etikett zeigt eine Reihe von csv-kommagetrennte Werte, die jeweils für eine Farbe, die je auf einen Eimer fallen Sie in.Ich würde lieber nicht verwenden, um mehrere Etiketten, so werden die Werte mit variabler Länge und möchte ich nicht spielen mit dynamischen layouts.Gibt es eine native Unterstützung für diese?

War es hilfreich?

Lösung

Es gibt keine native control in .NET, das dies tut.Ihre beste Wette ist, um zu schreiben Ihre eigenen UserControl (nennen Sie es RainbowLabel oder so).Normalerweise müssten Sie eine benutzerdefinierte label-Steuerelement erbt direkt von der Label, aber da kann man nicht bekommt multi-colored text in einem label, Sie würde nur von UserControl Erben.

Für die Darstellung der text, der UserControl konnten, teilen Sie die text auf Kommas und dann dynamisch laden, eine anders-farbige Beschriftung für jedes Stück.Ein besserer Weg, allerdings wäre es zum Rendern von text direkt auf Ihr Benutzersteuerelement mithilfe des DrawString und MeasureString Methoden in der Grafik-namespace.

Schreiben Benutzersteuerelemente in .NET ist wirklich nicht schwer, und diese Art von ungewöhnlichen problem ist genau das, was Sie benutzerdefinierte Benutzersteuerelemente sind für.

Update:hier ist eine einfache Methode, die Sie können verwenden Sie für die Wiedergabe der multi-colored text in einem PictureBox-Steuerelement:

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

Natürlich wird dies brechen, wenn Sie mehr als 4 durch Komma getrennte Elemente in Ihrem text, aber Sie bekommen die Idee.Auch scheint es einen kleinen Fehler in MeasureString macht, dass es wieder eine Breite, die ein paar Pixel breiter als nötig, so die multi-colored string wird ausgestreckt - möchten Sie vielleicht zu zwicken, Teil.

Es sollte einfach sein, dies zu ändern code für ein Benutzersteuerelement.

Hinweis:TextRenderer ist eine bessere Klasse für Zeichnung und mess-strings, da es verwendet ints.Grafik.Kordelzug und .MeasureString verwenden Sie schwimmt, so erhalten Sie aus-durch-ein-pixel-Fehler hier und da.

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

Andere Tipps

Sie könnten versuchen, mit einem RichTextBox-Steuerelement, so dass Sie können erhalten mehrere Farben für den string und dann machen Sie es nur Lesen und entfernen Sie den Rahmen.Ändern Sie die hintergrund Farbe auf die gleiche wie die Form es ist, und man könnte mit ihm Weg erhalten.

Als alternative, Sie könnten dies tun, wie rtf oder html, die in einem geeigneten Steuerelement (wie WebBrowser).Es würde wahrscheinlich ein bisschen mehr Ressourcen, die Sie idealerweise gerne, aber es funktioniert ziemlich schnell.

Wenn Sie bauen Ihre Windows-app für Menschen mit XP und up, können Sie WPF verwenden.Selbst wenn es eine Windows Forms-Anwendung, können Sie hinzufügen, ein WPF-Benutzersteuerelement.

Ich würde dann verwenden Sie eine Beschriftung, und setzen Sie den "Vordergrund" - Eigenschaft, die ein Gefälle von Farben.

Oder, in Windows Forms (kein WPF), Sie könnte verwenden Sie einfach einen "Flow " Systemsteuerung", und dann in einer for-Schleife fügen Sie mehrere Aufkleber als Segmente der sentense...Sie werden alle "flow" zusammen, als ob es war ein label.

Leicht off-topic ...Sie könnte überprüfen Sie auch:

Ich bin mit farbigen Etiketten oft zu markieren, Schlüsselwörter in rot Farbe etc.Wie in Phil Wright ist die Antwort, die ich verwenden Sie ein RichTextBox-Steuerelement, entfernen Sie den Rahmen und setzen Sie die Hintergrundfarbe auf SystemColors.Kontrolle.

Schreiben farbigen text das Steuerelement zuerst gelöscht und dann benutze ich diese Funktion zum Anhängen von farbigem text:

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 möchten, führen Sie diese Funktion mit "mono" - fügen Sie ein Leerzeichen vor jedem neuen text, farbiger text, oder mono wird nicht eingestellt, die neue Farbe richtig.Dies ist nicht erforderlich .NET

Verwendung:

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

Einfach können Sie mehrere Etiketten.Die schriftart-Eigenschaften, die Sie wollen, und dann verwenden die Links.top-und width-Eigenschaften zum anzeigen der Wörter, die Sie wollen, unterschiedlich angezeigt.Dies wird vorausgesetzt, Sie sind mit windows forms.

Versuchen Sie dieses,

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

Es gibt keine native Unterstützung für diese;Sie müssen entweder verwenden mehrere Etiketten oder finden Sie einen 3rd-party-Steuerelement, das diese Funktionalität bieten.

Ich denke nicht.Sollten Sie selbst eines erstellen.

Wie pro Ihre Frage auf Ihrer Anforderung ist einfach wie lable.Text = "This color is Red", So dass es zu display text wie diesen "Die Farbe ist" in Blau und "Rot" rot Farbe ..Dies kann getan werden, wie dies

lable.Text = "<span style='Color:Blue'>" + " The color is " +"</span>" + "<span style='Color:Red'>"Red"</span>"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top