Múltiples colores en una etiqueta C # .NET

Estoy buscando una forma de mostrar varios colores en una sola etiqueta C # /. NET. Por ejemplo, la etiqueta muestra una serie de valores separados por csv que cada uno toma en un color según el cubo en el que caigan. Preferiría no utilizar varias tags, ya que los valores son de longitud variable y no quiero jugar con diseños dynamics. ¿Hay un apoyo nativo para esto?

No hay control nativo en .NET que hace esto. Su mejor opción es escribir su propio UserControl (llámelo RainbowLabel o algo así). Normalmente, usted tendría un control de etiqueta personalizado heredado directamente de Label, pero como no puede obtener texto multicolor en una etiqueta, simplemente heredaría de UserControl.

Para renderizar el texto, su UserControl podría dividir el texto en comas y luego cargar dinámicamente una etiqueta de diferente color para cada fragmento. Sin embargo, una mejor manera sería renderizar el texto directamente en su UserControl usando los métodos DrawString y MeasureString en el espacio de nombres Graphics.

Escribir UserControls en .NET no es realmente difícil, y este tipo de problema inusual es exactamente para lo que son los UserControls personalizados.

Actualización : aquí hay un método simple que puede usar para representar el texto multicolor en un 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; } } } } 

Obviamente, esto se romperá si tienes más de 4 elementos delimitados por comas en tu texto, pero entiendes la idea. Además, parece que hay un pequeño error en MeasureString que hace que regrese un ancho que es un par de píxeles más ancho de lo necesario, por lo que la cadena multicolor aparece estirada; es posible que desee ajustar esa parte.

Debería ser sencillo modificar este código para un UserControl.

Nota : TextRenderer es una mejor clase para usar para dibujar y medir cadenas, ya que usa enter. Graphics.DrawString y .MeasureString usan flotantes, por lo que obtendrás errores "off-by-a-pixel" aquí y allá.

Actualización : Olvídate de usar TextRenderer. Es perro lento.

Podría intentar usar un RichTextBox para que pueda obtener varios colores para la cadena y luego hacer que sea de solo lectura y eliminar el borde. Cambie el color de fondo al mismo que en el Formulario en el que está y puede salirse con la suya.

Como alternativa, puede hacer esto como rtf o html en un control adecuado (como WebBrowser). Probablemente necesitaría un poco más de recursos que idealmente te gustaría, pero funcionará bastante rápido.

Si está construyendo su aplicación de Windows para personas con XP y superior, puede usar WPF. Incluso si se trata de una aplicación de Windows Forms, puede agregar un UserControl de WPF.

Luego usaría una etiqueta y establecería la propiedad “Primer plano” como un degradado de colores.

O bien, en Windows Forms (sin WPF), puede usar un “Panel de flujo” y luego en un bucle for agregar múltiples tags como segmentos de su sentencia … todos “fluirán” juntos como si fuera una sola etiqueta .