Как изменить ForeColor выбранного элемента ComboBox?

Можно ли изменить внешний вид для выбранного (не выпадающего!) Элемента?

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

3 ответа

Решение

Вам не нужно менять FlatStyle чтобы всплывающее окно или квартира, чтобы сделать эту работу. И вы, вероятно, не хотите делать это в первую очередь, потому что эти стили выглядят очень уродливо по сравнению с остальным интерфейсом вашего приложения. Родные элементы управления Windows используют внешний вид в стиле 3D; стили Flat и Popup предназначены для веб-приложений или приложений Windows Mobile, где они лучше подходят.

Я предполагаю, что вы задаете этот вопрос, потому что вы уже написали код для изменения цвета переднего плана текста, отображаемого в выпадающем списке, но заметили, что он не работает в Windows Vista или более поздней версии. Это потому, что когда DropDownList стиль комбинированного списка изменен, чтобы больше походить на кнопку в этих версиях Windows, также потеряна поддержка пользовательского цвета текста. Вместо этого выделенный текст всегда отображается в стандартном цвете "Текст окна". Сравните DropDownList стиль к обычному DropDown стиль combobox:

Сравнение стиля DropDownList со стилем DropDown в Windows Vista или более поздней версии

Визуально два комбинированных списка выглядят одинаково в более ранних версиях Windows, но не в Vista и более поздних версиях. Ключом к тому, чтобы ваш собственный цвет переднего плана появился, является изменение DropDownStyle свойство вашего списка управления в DropDown (что на самом деле по умолчанию).

Я также хотел бы установить FlatStyle собственность на System так что вы получите все изящные эффекты постепенного появления и исчезновения, предлагаемые встроенными элементами управления Windows. Standard Стиль пытается эмулировать эти эффекты в управляемом коде, но это не совсем правильно. Я забочусь о мелочах.

Затем вы можете использовать следующий код (как первоначально предложено в ответе Адриана):

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 показывает выделенный текст красным

Если вы можете изменить FlatStyle поля со списком на Popup или Flat, цвет выбранного элемента также изменится при изменении ForeColor.

Скриншот

Чтобы изменить только цвет выбранного элемента, вы можете применить какой-то обходной путь и менять ForeColor при каждом открытии или закрытии DropDown.

Пример кода:

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

Вы можете использовать sugestion от Cody Grey и добавить его к тому же поведению в стиле DropDownList:

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

Таким образом, пользователь не может редактировать комбинированный список.

Другие вопросы по тегам