Il n'existe pas de contrôle natif dans .NET qui permette de faire cela. Votre meilleure chance est d'écrire votre propre UserControl (appelez-le RainbowLabel ou autre). Normalement, le contrôle d'étiquette personnalisé devrait hériter directement de Label, mais comme il est impossible d'obtenir un texte multicolore dans une seule étiquette, il suffit d'hériter de UserControl.
Pour le rendu du texte, votre UserControl pourrait diviser le texte en virgules et charger dynamiquement une étiquette de couleur différente pour chaque fragment. Toutefois, une meilleure méthode consiste à rendre le texte directement sur votre UserControl à l'aide des méthodes DrawString et MeasureString de l'espace de noms Graphics.
Il n'est vraiment pas difficile d'écrire des commandes utilisateur dans .NET, et ce type de problème inhabituel est exactement le but des commandes utilisateur personnalisées.
Mise à jour Voici une méthode simple que vous pouvez utiliser pour rendre le texte multicolore d'une 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;
}
}
}
}
Évidemment, cela ne fonctionnera pas si vous avez plus de 4 éléments séparés par des virgules dans votre texte, mais vous voyez l'idée. De plus, il semble y avoir un petit problème dans MeasureString qui lui fait renvoyer une largeur de quelques pixels plus large que nécessaire, de sorte que la chaîne multicolore semble étirée - vous pourriez vouloir modifier cette partie.
Il devrait être facile de modifier ce code pour un UserControl.
Note : TextRenderer est une meilleure classe à utiliser pour dessiner et mesurer des chaînes de caractères, car elle utilise des ints. Graphics.DrawString et .MeasureString utilisent des flottants, et vous aurez donc des erreurs à un pixel près ici et là.
Mise à jour : Oubliez sur l'utilisation de TextRenderer. Il est très lent.