Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

В .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 - лучший класс для рисования и измерения строк, поскольку он использует ints. Graphics.DrawString и .MeasureString используют float, так что вы будете получать ошибки за один пиксел здесь и там.

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 6

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

Ответ 7

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

Если вы хотите запустить эту функцию с помощью "mono", добавьте пробел перед каждым новым цветным текстом, или моно не будет правильно устанавливать новый цвет. Это не требуется с .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);

Ответ 8

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

Ответ 9

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

Ответ 10

В соответствии с вашим вопросом ваше требование простое: lable.Text = "This color is Red", поэтому он должен отображать текст, подобный этому "Цвет" будет в синем, а "Красный" будет красного цвета. Это можно сделать следующим образом:

lable.Text = "<span style='Color:Blue'>" + " The color is " +"</span>" + "<span style='Color:Red'>"Red"</span>"