it-swarm.com.ru

Несколько цветов в метке C # .NET

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

34
Cory

В .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. Это собака медленная.

42
MusiGenesis

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

14
Phil Wright

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

4
Marc Gravell

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

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

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

4
Timothy Khouri

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

1
Yordan Georgiev

Я часто использую цветные метки, чтобы помечать ключевые слова красным цветом и т.д Как и в ответе Фила Райта, я использую элемент управления 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);
0
harry4516

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

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

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

0
Chris Wegener