如何更改ComboBox的选定项目的ForeColor?

时间:2011-03-15 13:58:08

标签: c# winforms .net-4.0 combobox

是否可以更改所选(不是下拉!)项目的外观?

combobox.ForeColor正在将所有项目的文字颜色更改为下拉列表。

修改 变种是beelow,我们的是

 public static void CBoxDrawItem(object sender, DrawItemEventArgs args)
    {
        var box = sender as ComboBox;
        if (box == null || args.Index < 0 || args.Index >= box.Items.Count)
            return;

        e.DrawBackground();
        var data = box.Tag as ControlData;
        var color = (args.State & DrawItemState.ComboBoxEdit) == 0 || data == null || !data.IsInDefaultState
            ? e.ForeColor : GetDefaultColor(e.ForeColor);
        using (var brush = new SolidBrush(color))
        {
            args.Graphics.DrawString(box.Items[args.Index].ToString(), args.Font, brush, args.Bounds.X, args.Bounds.Y);
        }
        args.DrawFocusRectangle();
    }

3 个答案:

答案 0 :(得分:9)

您无需将FlatStyle更改为Popup或Flat即可使其正常工作。而且你可能首先不想这样做,因为与应用程序界面的其他部分相比,这些样式看起来非常难看。原生Windows控件使用3D风格的外观; Flat和Popup样式是为Web或Windows Mobile应用程序设计的,它们更适合它们。

我假设您提出这个问题是因为您已经编写了代码来更改组合框中显示的文本的前景色,但是已经注意到它在Windows Vista或更高版本下无法正常工作。那是因为当DropDownList样式的组合框改变为看起来更像是那些版本的Windows中的按钮时,它也失去了对自定义文本颜色的支持。相反,所选文本始终以标准“窗口文本”颜色显示。将DropDownList样式与常规DropDown样式组合框进行比较:

Comparing the DropDownList style to the DropDown style under Windows Vista or later

从视觉上看,两个组合框在早期版本的Windows中看起来是一样的,但在Vista及更高版本中则不然。 显示自定义前景色的关键是将组合框控件的DropDownStyle property更改为DropDown (实际上是默认设置)。

我还想将FlatStyle property设置为System,以便您获得本机Windows控件提供的所有漂亮的淡入和淡出效果。 Standard样式尝试在托管代码中模拟这些效果,但它没有完全正确的感觉。我关心这些小事。

然后您可以使用以下代码(最初在Adrian的回答中提出):

public Form1()
{
   InitializeComponent();

   // Set custom combobox styles
   comboBox1.DropDownStyle = ComboBoxStyle.DropDown;
   comboBox1.FlatStyle = FlatStyle.System;

   // Attach relevant event handler methods
   comboBox1.DropDown += new EventHandler(comboBox1_DropDown);
   comboBox1.DropDownClosed += new EventHandler(comboBox1_DropDownClosed);
}

void comboBox1_DropDown(object sender, EventArgs e)
{
   // Optionally, revert the color back to the default
   // when the combobox is dropped-down
   //
   // (Note that we're using the ACTUAL default color here,
   //  rather than hard-coding black)
   comboBox1.ForeColor = SystemColors.WindowText;
}

void comboBox1_DropDownClosed(object sender, EventArgs e)
{
   // Change the color of the selected text in the combobox
   // to your custom color
   comboBox1.ForeColor = Color.Red;
}

产生以下效果:

ComboBox showing selected text in red

答案 1 :(得分:4)

如果您可以将组合框的FlatStyle更改为Popup或Flat,则更改ForeColor时所选项目的颜色也会更改。

Screenshot

要仅更改所选项目的颜色,您可以实施某种解决方法,并在每次打开或关闭DropDown时更改ForeColor。

代码示例:

 public Form1()
    {
        InitializeComponent();

        comboBox1.FlatStyle = FlatStyle.Popup;

        comboBox1.DropDown += new EventHandler(comboBox1_DropDown);
        comboBox1.DropDownClosed += new EventHandler(comboBox1_DropDownClosed);
    }

    void comboBox1_DropDownClosed(object sender, EventArgs e)
    {
        comboBox1.ForeColor = Color.Red;
    }

    void comboBox1_DropDown(object sender, EventArgs e)
    {
        comboBox1.ForeColor = Color.Black;
    }

答案 2 :(得分:1)

你可以使用Cody Gray的建议并添加它以具有相同的DropDownList Style行为:

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

通过这种方式,用户无法编辑组合框。