2010-09-24 27 views
5

¿Puedo cambiar el aspecto de un ComboBox de Winforms para que un cuadro combinado con DropDownStyle = DropDownList se parezca más a uno que es DropDownStyle = DropDown. La diferencia funcional entre ellos es que el primero no permite los valores ingresados ​​por el usuario, el problema es que el esquema de color predeterminado se ve atenuado y no coincide con los cuadros de texto en el mismo cuadro de diálogo.Aspecto del cuadro combinado

Respuesta

11

puede obtener DropDown aparición de DropDownList estilo, cambiando DrawMode propiedad a DrawMode.OwnerDrawFixed y gastos de pintura elemento por sí mismo (por suerte, eso es fácil). Clase de muestra, implementando esta idea:

public class ComboBoxEx : ComboBox 
{ 
    public ComboBoxEx() 
    { 
     base.DropDownStyle = ComboBoxStyle.DropDownList; 
     base.DrawMode = DrawMode.OwnerDrawFixed; 
    } 

    protected override void OnDrawItem(DrawItemEventArgs e) 
    { 
     e.DrawBackground(); 
     if(e.State == DrawItemState.Focus) 
      e.DrawFocusRectangle(); 
     var index = e.Index; 
     if(index < 0 || index >= Items.Count) return; 
     var item = Items[index]; 
     string text = (item == null)?"(null)":item.ToString(); 
     using(var brush = new SolidBrush(e.ForeColor)) 
     { 
      e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; 
      e.Graphics.DrawString(text, e.Font, brush, e.Bounds); 
     } 
    } 
} 
+0

Interesante. ¿Es eso algo que escribiste desde cero o sacaste del marco utilizando el reflejo? –

+2

Está escrito desde cero. De hecho, este comportamiento no es realmente esperado. Hace algún tiempo necesité implementar un cuadro combinado con una pintura de elementos personalizada y noté que cambiar la propiedad 'DrawMode' también afecta el estilo de control, forzándolo a' DropDown'. – max

+1

+1, @max: muy agradable! –

2

Puede intentar cambiar la propiedad FlatStyle y ver si obtiene algo más de su agrado. Si realmente quiere que se vea como lo hace con DropDownStyle conjunto de DropDown, podría configurar el DropDownStyle a DropDown y comer el KeyPress evento:

private void comboBox1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    e.Handled = true; 
} 

Aún así, probablemente no haría esto como la aparición de la ComboBox es una señal visual para el usuario que indica si debería poder escribir en el área de texto o no.

+0

Al menos en win7 que solo cambia el borde. El interior del control sigue siendo un degradado gris similar al fondo del formulario. IIRC en XP la diferencia entre los dos estilos de caída fue mucho menos dramática. –

Cuestiones relacionadas