2010-09-24 27 views
5

Tôi có thể thay đổi giao diện của Hộp tổ hợp Winforms sao cho Combobox có DropDownStyle = DropDownList trông giống như một hộp là DropDownStyle = DropDown. Sự khác biệt chức năng giữa chúng là trước đây không cho phép người dùng nhập giá trị, vấn đề là màu mặc định của nó trông có màu xám và không khớp với hộp văn bản trên cùng một hộp thoại.Xuất hiện hộp kết hợp

Trả lời

11

bạn có thể nhận được DropDown xuất hiện từ DropDownList kiểu bằng cách thay đổi DrawMode thuộc tính thành DrawMode.OwnerDrawFixed và xử lý mục vẽ một mình (may mắn thay, thật dễ dàng). Lớp mẫu, triển khai ý tưởng này:

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

Thú vị. Có phải đó là thứ bạn đã viết từ đầu hoặc được lấy từ khung công tác bằng cách sử dụng sự phản chiếu không? –

+2

Nó được viết từ đầu. Trong thực tế, hành vi này không thực sự mong đợi. Một số thời gian trước, tôi cần phải thực hiện một hộp kết hợp với bức tranh mục tùy chỉnh và nhận thấy rằng việc thay đổi thuộc tính 'DrawMode' cũng ảnh hưởng đến kiểu điều khiển, buộc nó vào' DropDown'. – max

+1

+1, @max: rất đẹp! –

2

Bạn có thể thử thay đổi thuộc tính FlatStyle và xem bạn có nhận được điều gì đó theo ý thích của mình hay không. Nếu bạn thực sự muốn nó trông giống như nó làm với DropDownStyle thiết lập để DropDown, bạn có thể thiết lập các DropDownStyle-DropDown và ăn sự kiện KeyPress:

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

Tuy nhiên, tôi có lẽ sẽ không làm điều này như sự xuất hiện của ComboBox là một gợi ý trực quan cho người dùng cho biết liệu họ có thể nhập vào vùng văn bản hay không.

+0

Ít nhất trong win7 chỉ thay đổi đường viền. Nội thất của điều khiển vẫn là một gradient màu xám tương tự như hình nền. IIRC trong XP sự khác biệt giữa hai kiểu thả xuống ít kịch tính hơn nhiều. –

Các vấn đề liên quan