2010-09-24 42 views
5

我可以更改WinForms組合框的外觀,以便與DropDownStyle = DropDownList看起來更像是一個DropDownStyle = DropDown。它們之間的功能差異在於前者不允許用戶輸入值,問題在於它的默認顏色方案顯示爲灰色,並且與同一對話框上的文本框不匹配。Combobox外觀

回答

11

可以通過更改DrawMode財產DrawMode.OwnerDrawFixed和自行處理項目的繪畫得到DropDownList風格DropDown外觀(謝天謝地,這很容易)。示例類,實現這個想法:

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

有趣。那是你從頭開始編寫的東西還是使用反射從框架中拉出來的東西? – 2010-09-24 18:12:36

+2

它是從頭開始編寫的。事實上,這種行爲並不是真正的預期。前一段時間,我需要實現一個帶有自定義項目繪製的組合框,並注意到更改'DrawMode'屬性也會影響控件樣式,並將其強制爲'DropDown'。 – max 2010-09-24 18:17:49

+1

+1,@max:非常好! – 2010-09-24 19:23:55

2

您可以嘗試更改FlatStyle屬性並查看是否有更多符合您的喜好的東西。如果你真的希望它看起來像它與DropDownStyle設置爲DropDown,你可以設置DropDownStyleDropDown,吃KeyPress事件:

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

不過,我可能無法做到這一點的ComboBox外觀是用戶的視覺提示,表明他們是否應該能夠輸入文本區域。

+0

至少在win7中只改變邊界。控件的內部仍然是一個類似於窗體背景的灰色漸變。 IIRC在XP中,兩種拖放風格之間的差異並不那麼戲劇化。 – 2010-09-24 18:06:34