2011-06-24 17 views
19

En una aplicación winform que se ejecuta en Windows 7, quiero que cambie el color de fondo de un cuadro combinado para resaltarlo. El comboxbox tiene DropDownStyle de DropDownList.Cómo cambiar el color de fondo de la caja de combinación (no solo la parte de lista desplegable)

Cuando programáticamente cambie la propiedad BackColor a Rojo, solo el fondo de la lista desplegable real cambia a Rojo. Cuando la lista desplegable no está abierta, el fondo del cuadro combinado que muestra el valor seleccionado permanece gris. ¿Qué puedo hacer para que se ponga rojo también?

Establecer la propiedad BackColor funciona bien cuando la aplicación se ejecuta en Windows XP

Respuesta

14

Esto debería empezar.

Cambie la propiedad cuadro combinado DrawMode a OwnerDrawFixed, y controlar el evento DrawItem:

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    int index = e.Index >= 0 ? e.Index : 0; 
    var brush = Brushes.Black; 
    e.DrawBackground(); 
    e.Graphics.DrawString(comboBox1.Items[index].ToString(), e.Font, brush, e.Bounds, StringFormat.GenericDefault); 
    e.DrawFocusRectangle(); 
} 

El color de fondo será correcta, pero el estilo de la caja será, no el estilo habitual plana 3D.

+6

Gracias es un buen comienzo. ¿Alguien sabe cómo cambiar el color de fondo y preservar el estilo 3D? – JBB

+0

¡Muy útil! Gracias. Tuve que agregar ... if (e.Index == -1) return; --- como obtuve una 'System.ArgumentOutOfRangeException' cuando cargué. Además, sería bueno cambiar el color de fondo cuando se enfoca. –

6

Como de todos modos pierde los efectos 3D con la solución de Igby Largeman, es mejor que cambie la propiedad FlatStyle a Flat. El color de fondo parece obedecerse incluso en Windows 7 de esa manera, y sin volver a implementar ningún evento de bajo nivel.

Considero que esto es un error en la parte de Microsoft ...

+0

Esto da como resultado una apariencia muy diferente y también da como resultado algunos artefactos parpadeantes más bien molestos. –

+0

Me estaba dando problemas en Windows Server 2012 R2. Lo mismo estaba funcionando bien en Windows Server 2008. Cambiar el 'FlatStyle' a' Flat' funciona. Me salvaste el día en un momento crucial. – RBT

Cuestiones relacionadas