Несколько цветов в метке C # .NET - PullRequest
35 голосов
/ 09 ноября 2008

Я ищу способ отображения нескольких цветов на одной этикетке C # / .NET. Например, на этикетке отображается ряд значений, разделенных CSV, каждое из которых принимает цвет в зависимости от сегмента, в который они попадают. Я бы предпочел не использовать несколько меток, так как значения имеют переменную длину, и я не хочу играть с динамическими макетами. Есть ли встроенная поддержка для этого?

Ответы [ 11 ]

43 голосов
/ 09 ноября 2008

В .NET нет собственного элемента управления, который бы это делал. Лучше всего написать собственный UserControl (назовите его RainbowLabel или что-то в этом роде). Как правило, пользовательский элемент управления меткой наследуется непосредственно от Label, но поскольку вы не можете получить разноцветный текст в одной метке, вы просто наследуете от UserControl.

Для рендеринга текста ваш UserControl может разбить текст на запятые, а затем динамически загружать разноцветные метки для каждого чанка. Однако лучшим способом было бы визуализировать текст непосредственно в свой UserControl, используя методы DrawString и MeasureString в пространстве имен Graphics.

Написание UserControls в .NET действительно не сложно, и такая необычная проблема - именно то, для чего нужны пользовательские UserControls.

Обновление : вот простой метод, который вы можете использовать для рендеринга разноцветного текста в 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;
            }
        }
    }
}

Очевидно, что это сломается, если в вашем тексте более 4 элементов, разделенных запятыми, но вы поняли идею. Кроме того, в MeasureString есть небольшая ошибка, которая заставляет его возвращать ширину, которая на пару пикселей шире необходимой, поэтому разноцветная строка выглядит растянутой - возможно, вы захотите настроить эту часть.

Это должно быть просто изменить этот код для UserControl.

Примечание : TextRenderer - лучший класс для рисования и измерения строк, поскольку он использует целые числа. Graphics.DrawString и .MeasureString используют числа с плавающей запятой, поэтому здесь и там будут возникать пост-пиксельные ошибки.

Обновление : Забудьте об использовании TextRenderer. Это собака медленно.

15 голосов
/ 09 ноября 2008

Вы можете попробовать использовать RichTextBox, чтобы получить несколько цветов для строки, а затем сделать ее доступной только для чтения и удалить границу. Измените цвет фона на тот же, что и на форму, и вам это может сойти с рук.

4 голосов
/ 09 ноября 2008

Если вы создаете свое приложение для Windows для людей с XP и выше, вы можете использовать WPF. Даже если это приложение Windows Forms, вы можете добавить WPF UserControl.

Затем я бы использовал метку и установил для свойства «Передний план» градиент цветов.

Или, в Windows Forms (без WPF), вы можете просто использовать «Панель управления», а затем в цикле for добавить несколько меток в качестве сегментов вашего предложения ... все они будут «течь» вместе, как если бы был один ярлык.

4 голосов
/ 09 ноября 2008

В качестве альтернативы вы можете сделать это как rtf или html в подходящем элементе управления (например, WebBrowser). Вероятно, потребовалось бы немного больше ресурсов, которые вам бы идеально понравились, но это будет работать довольно быстро.

1 голос
/ 09 октября 2015

Я часто использую цветные ярлыки, чтобы пометить ключевые слова красным цветом и т. Д. Как и в ответе Фила Райта, я использую элемент управления RichTextBox, удаляю границу и устанавливаю цвет фона для SystemColors.Control.

Для написания цветного текста элемент управления сначала очищается, а затем я использую эту функцию для добавления цветного текста:

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

Если вы хотите запустить эту функцию с «моно», добавьте пробел перед каждым новым цветным текстом, иначе моно не установит новый цвет правильно. Это не требуется с .NET

Использование:

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);
1 голос
/ 09 июля 2009

Немного не по теме ... Вы также можете проверить:

0 голосов
/ 22 февраля 2018

Попробуйте это,

   labelId.Text = "Successfully sent to" + "<a style='color:Blue'> "  + name + "</a>"; 
0 голосов
/ 20 июня 2011

Вы можете просто использовать несколько меток. Установите нужные вам свойства шрифта, а затем используйте левую. Свойства top и width для отображения по-разному нужных слов. Предполагается, что вы используете формы Windows.

0 голосов
/ 07 января 2009

согласно вашему вопросу ваше требование просто как lable.Text = "This color is Red", так должно отображаться текст вот так «Цвет» будет синим, а «красный» - красным. Это можно сделать так

lable.Text = "<span style='Color:Blue'>" + " The color is " +"</span>" + "<span style='Color:Red'>"Red"</span>"
0 голосов
/ 09 ноября 2008

Я так не думаю. Вы должны создать его самостоятельно.

...