Я ищу способ отображения нескольких цветов в одной метке С#/. NET. Например, на этикетке отображается серия значений, разделенных csv, каждая из которых принимает цвет в зависимости от того, в какой ведро они попадают. Я бы предпочел не использовать несколько меток, поскольку значения переменной длины и я не хочу играть с динамическими макетами. Есть ли поддержка для этого?
Несколько цветов в метке С#.NET.
Ответ 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 добавить несколько ярлыков в качестве сегментов вашего сенсенса... все они будут "течь" вместе, как будто это была одной меткой.
Ответ 5
Слегка от темы... Вы также можете проверить:
Ответ 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>"