2010-09-24 2 views
5

Могу ли я изменить внешний вид Winforms ComboBox, чтобы Combobox с DropDownStyle = DropDownList выглядел больше похожим на DropDownStyle = DropDown. Функциональная разница между ними заключается в том, что первая не позволяет вводить введенные пользователем значения, проблема в том, что цветовая схема по умолчанию выглядит серым и не соответствует текстовым полям в том же диалоговом окне.Внешний вид Combobox

ответ

11

вы можете получить DropDown вид из DropDownList стиля, изменив DrawMode свойство DrawMode.OwnerDrawFixed и обработки элемента картины самостоятельно (к счастью, это легко). Пример класса, реализующего эту идею:

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

Интересно. Это то, что вы написали с нуля или вытащили из рамки с помощью отражения? –

+2

Это написано с нуля. На самом деле такое поведение на самом деле не ожидается. Некоторое время назад мне нужно было создать комбинированный блок с индивидуальной живописью элементов и заметил, что изменение свойства DrawMode также влияет на стиль управления, заставляя его «DropDown». – max

+1

+1, @max: очень приятно! –

2

Вы можете попробовать изменить свойство FlatStyle и посмотреть, есть ли у вас чем-нибудь по своему вкусу. Если вы действительно хотите, чтобы это выглядело, как это делает с DropDownStyle набором для DropDown, вы можете установить DropDownStyle в DropDown и есть KeyPress событие:

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

Тем не менее, я бы, вероятно, не сделать это как появление ComboBox является визуальной подсказкой для пользователя, указывающей, должны ли они иметь возможность вводить текстовую область или нет.

+0

По крайней мере, в win7, который только изменяет границу. Внутренняя часть элемента управления остается серым градиентом, подобным фону формы. IIRC в XP разница между двумя стилями капли была гораздо менее драматичной. –

Смежные вопросы