Как изменить 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:
Визуально два комбинированных списка выглядят одинаково в более ранних версиях 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;
}
Для получения следующего эффекта:
Если вы можете изменить 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;
}
Таким образом, пользователь не может редактировать комбинированный список.