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