如何更改ComboBox中所选项目的ForeColor?

7

是否有可能更改所选(不在下拉列表中的)项的外观?

combobox.ForeColor 仅更改下拉列表中所有项的文本颜色。

编辑: 变体如下,我们的是

 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();
    }

你使用的是哪种样式的下拉框?简单样式、下拉样式还是下拉列表样式? - Cody Gray
请看我的回答——你需要将它更改为DropDown,因为在Windows Vista及更高版本下,没有办法使DropDownList以自定义颜色绘制,因为它是基于主题的。 - Cody Gray
3个回答

12
你不需要将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
+1,比我的答案更完整。如果需要将其作为只读处理,则应将样式更改为DropDown以使其可编辑。 - Adrian Fâciu
这并不总是好的,拥有可编辑元素 :) 而且像您的图像一样,combox 的外观也发生了变化。 - Lonli-Lokli
@Lonli: 你说得对,不幸的是编程需要做出许多妥协。正如我在我的回答中所解释的那样,没有办法既得到新的主题控件,又能够自定义字体颜色。你要么需要改变控件的样式,要么完全禁用该特定控件的主题(这将产生相同的效果),要么放弃指定自定义字体颜色。 - Cody Gray
是的,我们的 varint 在第一篇帖子中。 - Lonli-Lokli

5

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

屏幕截图

要仅更改所选项目的颜色,您可以实现某种解决方法,并在打开或关闭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
您可以使用Cody Gray的建议,并将其添加到具有相同DropDownList样式行为的控件中:
private void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    e.Handled = true;
}

通过这种方式,用户无法编辑下拉框。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接