更改禁用的组合框BackColor的功能是一个错误还是一个功能

本文关键字:一个 功能 错误 组合 BackColor | 更新日期: 2023-09-27 17:57:38

我找到了以下解决方案:如果我输入设计师:

this.comboBox1.BackColor = System.Drawing.Color.White;  //or any other color
this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; //it has to be that style

我可以更改comboBox1的颜色——它不会总是灰色的。

它应该是DropDownList,BackColor也应该放在设计器中。

是bug还是特性?

更改禁用的组合框BackColor的功能是一个错误还是一个功能

制作自定义组合框,然后在WndProc中为禁用的控件设置BackColor

public class ComboBoxCustom : ComboBox {
    [DllImport("gdi32.dll")]
    internal static extern IntPtr CreateSolidBrush(int color);
    [DllImport("gdi32.dll")]
    internal static extern int SetBkColor(IntPtr hdc, int color);
    protected override void WndProc(ref Message m){
        base.WndProc(ref m);
        IntPtr brush;
        switch (m.Msg){
            case (int)312:
                SetBkColor(m.WParam, ColorTranslator.ToWin32(this.BackColor));
                brush = CreateSolidBrush(ColorTranslator.ToWin32(this.BackColor));
                m.Result = brush;
                break;
            default:
                break;
        }
    }
}

DropDownList允许更改BackColor,无需在Designer中设置颜色,只需在属性窗格中将comboBox属性设置为DropDownList。

我也遇到了这个问题,但由于DropDownStyle属性接收了ComboBoxStyle枚举来设置样式。

yourCombo.DropDownStyle = ComboBoxStyle.DropDownList;

禁用的控件具有默认BackColor = Color.Grey。它打算被改变。

编辑:

我相信这只是"最简单的"。是的,当您开始自定义颜色时,必须提供代码来设置控件在所有状态下的属性。这样想吧:。Net假设,如果您要自定义一个属性,您将负责始终设置该属性。

comboBox1派生自Control类,公开Control.EnabledChanged事件。这就是您的逻辑需要实现的地方,以便为启用和禁用状态设置自己的默认值;例如:

private void radioButton1_EnabledChanged(object sender, EventArgs e)
{
    if (((ComboBox)sender).Enabled)
    {
        // set BackColor for enabled state
    }
    else
    {
        // set BackColor for disabled state
    }
}