Как изменить ForeColor выбранного элемента ComboBox? - PullRequest
5 голосов
/ 15 марта 2011

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

combobox.ForeColor изменяет цвет текста только для всех элементов в раскрывающемся списке.

Edit: Варианты ниже, наши

 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 ]

9 голосов
/ 16 марта 2011

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

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

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

Визуально два комбинированных списка выглядят одинаково в более ранних версиях 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 showing selected text in red

4 голосов
/ 15 марта 2011

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

Screenshot

Чтобы изменить только цвет выбранного элемента, вы можете применить какой-то обходной путь и изменять 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;
    }
1 голос
/ 08 мая 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...