2010-02-15 23 views
7
  1. ¿Hay alguna manera de colorear partes de los elementos del ListBox (no solo de la línea completa)? Por ejemplo, el elemento del cuadro de lista consta de 5 palabras y solo uno es de color o 3 de 5.
  2. ¿Hay alguna manera de hacer lo mismo con ListView? (Sé que ListView puede ser de color por columna, pero me gustaría tener varios colores en una columna).

Me interesan solo las soluciones gratuitas, y prefiero que no sean pesadas para implementar o cambiar el uso actual (el menor esfuerzo para introducir ListBox de colores en lugar de uno normal, mejor).Forma de colorear partes de la línea Listbox/ListView en C# WinForms?

En lo que respecta,

MadBoy

Respuesta

14

This article indica cómo usar DrawItem de un ListBox con DrawMode establecido en uno de los valores de OwnerDraw. Básicamente, se hace algo como esto:

listBox1.DrawMode = OwnerDrawFixed; 
listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBox1_DrawItem); 

private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
{ 
e.DrawBackground(); 
e.DrawFocusRectangle(); 
// TODO: Split listBox1.Items[e.Index].ToString() and then draw each separately in a different color 
e.Graphics.DrawString(listBox1.Items[e.Index].ToString(),new Font(FontFamily.GenericSansSerif, 14, FontStyle.Bold),new SolidBrush(color[e.Index]),e.Bounds); 
} 

En lugar de la llamada DrawString sola, Split ListBox1.Items [e.Index] .ToString() en palabras y hacer una llamada independiente a DrawString para cada palabra. Tendrá que reemplazar e.bounds con una ubicación x, y o un rectángulo delimitador para cada palabra.

El mismo enfoque debería funcionar para ListView.

+0

Solo una observación: por lo que puedo decir, esto evita que la barra de desplazamiento horizontal automática ('HorizontalScrollbar = true;') aparezca cuando el contenido del 'Control' es demasiado grande. – Pooven

1

No hay API incorporado que soporta este tipo de modificación a un WinForms ListBox o ListView. Sin duda, es posible lograr esto, pero la solución implicará una gran cantidad de pintura personalizada y WndProc que probablemente prevalezca. Esta será una solución muy complicada y pesada.

Si este tipo de experiencia es importante para su aplicación, creo que debería considerar seriamente WPF como una solución. WPF está diseñado para proporcionar este tipo de caramelos y es probable que haya muchas muestras en la web para que pueda comenzar a usarlo.

+0

Sí, estoy muy interesado en trabajar con WPF, pero debería haber elegido WPF hace más de 1 año, y no ahora cuando se trata de 90k líneas de código (donde GUI es como 30k líneas). Portarlo a WPF sería realmente un asesino del tiempo. – MadBoy

Cuestiones relacionadas