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
è 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);
}
}
}
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.
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. –
Interessante. È qualcosa che hai scritto da zero o estratto dal framework usando la riflessione? –
È 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, @max: molto bello! –