DropdownStyle是DropDownList时如何更改ComboBox的BackColor?

时间:2016-03-31 22:43:12

标签: c# .net winforms windows-applications dropdownbox

ComboBox属性为DropdownStyle时,我正在尝试更改DropdownList的显示颜色。当属性从Dropdown更改为DropdownList时,颜色会发生变化。

如何控制下拉框的视图颜色?

由于

4 个答案:

答案 0 :(得分:11)

您可以将FlatStyle属性设置为Popup。这样,背面颜色将同时用于DropDownDropDownList模式。

如果您不喜欢平面样式,或者在渲染ComboBox时需要更多自定义,则可以使用所有者绘制的ComboBox。例如,您可以将DrawMode属性设置为OwnerDrawFixed并处理DrawItem事件,并根据您的逻辑绘制组合框。

答案 1 :(得分:2)

就像上面提到的一样;您可以将FlatStyle属性设置为Popup / Flat。这样,在DropDown和DropDownList模式下都可以使用背景色。

但是那样的话,您将不会拥有预期的外观。 我有一个技巧,可以创建面板并将其border属性更改为FixedSingle。将面板的颜色更改为所需的颜色,然后更改其size属性以匹配ComboBox的大小。例如80、22。 在放置组合框的位置,放置面板。 将您的组合框放在面板上。 如果您可以微调其位置,则在调试时,您会发现ComboBox看起来像是有边框的。

答案 2 :(得分:1)

我使用堆栈溢出已经有两年了,没有订阅或贡献。寻找解决方案是我的第一选择,因为它通常提供解决方案,而且无需缩放即可阅读它。我已经81岁了,是化石,但是“灭绝是一种乐趣。” 谢谢,奥格登·纳什(Ogden Nash)。

当对文本应用背景阴影时,对比度降低会导致我的老眼睛难以阅读它。我用Google搜索了问题,提供的解决方案使我感到震惊。 我什至考虑过使用图形来简化功能,但是我需要几个实例。一定可以。

用文本框覆盖组合框的文本部分,并将文本框更改为多行以使其高度与组合框匹配。添加几个事件处理程序,鲍勃是你的叔叔。

Private Sub cmbPoints_SelectedIndexChanged(sender As Object, e As EventArgs
                                     )HandlescmbPoints.SelectedIndexChanged
  ' Make the selection visible in the textbox
  txtPoints.Text = cmbPoints.Text
End Sub
Private Sub txtPoints_GotFocus(sender As Object, e As EventArgs
                              ) Handles txtPoints.GotFocus
  ' Prevent the user changing the text.
  cmbPoints.Focus()
End Sub

答案 3 :(得分:0)

我创建了自己的用户控件。您必须将下拉列表设置为 Flatstyle=Flat 并更改 Backcolor=White。然后下面的代码将绘制缺少的边框。下面是代码和它的外观图片。您可以将其复制并粘贴到您自己的命名空间中的某处,并根据您的喜好命名。

注意:您需要添加 System.Windows.Forms; System.ComponentModel;和 System.Drawing;到你的班级。

using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

public class KDCombo : ComboBox
{

    public KDCombo()
    {
        BorderColor = Color.DimGray;
    }

    [Browsable(true)]
    [Category("Appearance")]
    [DefaultValue(typeof(Color), "DimGray")]
    public Color BorderColor { get; set; }

    private const int WM_PAINT = 0xF;
    private int buttonWidth = SystemInformation.HorizontalScrollBarArrowWidth;
    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == WM_PAINT)
        {
            using (var g = Graphics.FromHwnd(Handle))
            {
                // Uncomment this if you don't want the "highlight border".
                /*
                using (var p = new Pen(this.BorderColor, 1))
                {
                    g.DrawRectangle(p, 0, 0, Width - 1, Height - 1);
                }*/
                using (var p = new Pen(this.BorderColor, 2))
                {
                    g.DrawRectangle(p, 0, 0, Width , Height );
                }
            }
        }
    }
}

enter image description here