2010-09-24 18 views
5

Posso modificare l'aspetto di un ComboBox Winforms in modo che un Combobox con DropDownStyle = DropDownList assomigli più a uno che sia DropDownStyle = DropDown. La differenza funzionale tra di loro è che il primo non consente valori inseriti dall'utente, il problema è che la combinazione di colori predefinita appare in grigio e non corrisponde alle caselle di testo nella stessa finestra di dialogo.Aspetto Combobox

risposta

11

è possibile ottenere DropDown aspetto da DropDownList stile modificando DrawMode proprietà DrawMode.OwnerDrawFixed spedizione pittura elemento da solo (per fortuna, questo è facile). Esempio di classe, implementando questa 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

Interessante. È qualcosa che hai scritto da zero o estratto dal framework usando la riflessione? –

+2

È stato scritto da zero. In realtà, questo comportamento non è realmente previsto. Qualche tempo fa avevo bisogno di implementare una casella combinata con la pittura di oggetti personalizzati e ho notato che la modifica della proprietà 'DrawMode' influenza anche lo stile di controllo, forzandolo a' DropDown'. – max

+1

+1, @max: molto bello! –

2

Si potrebbe provare a modificare la proprietà FlatStyle e vedere se si ottiene qualcosa di più di vostro gradimento. Se si vuole veramente a guardare come fa con DropDownStyle set per DropDown, è possibile impostare il DropDownStyle-DropDown e mangiare l'evento KeyPress:

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

Eppure, non avrei probabilmente fare questo come l'aspetto della ComboBox è un segnale visivo per l'utente che indica se devono essere in grado di digitare nell'area di testo o meno.

+0

Almeno in win7 che modifica solo il bordo. L'interno del controllo rimane un gradiente grigio simile allo sfondo del modulo. IIRC in XP la differenza tra i due stili di rilascio era molto meno drammatica. –