我制作了自己的ComboBox控件,以便使用具有自定义背景和前景色的项目。 ComboBox也被定义为DropDownList。
public class CustomComboBox : ComboBox
{
public CustomComboBox()
{
DrawMode = DrawMode.OwnerDrawVariable;
DropDownStyle = ComboBoxStyle.DropDownList;
FlatStyle = FlatStyle.Flat;
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
base.OnDrawItem(e);
e.DrawBackground();
var item = ((ResultColor)Items[e.Index]);
e.Graphics.FillRectangle(item.BackgroundColor, e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height);
e.Graphics.DrawString(item.Name, Font, item.Color, e.Bounds.X, e.Bounds.Y);
e.DrawFocusRectangle();
}
}
如果重要,我的ResultColor类如下:
public class ResultColor
{
public ResultColor(int id, string name, Brush color, Brush backgroundColor)
{
Id = id;
Name = name;
Color = color;
BackgroundColor = backgroundColor;
}
public int Id { get; set; }
public string Name { get; set; }
public Brush Color { get; set; }
public Brush BackgroundColor { get; set; }
public override string ToString()
{
return Name;
}
}
我遇到的最初问题是,当悬停在聚焦的项目时,列表中没有颜色。
进一步环顾四周,我发现我可以使用e.State
检查当前项目状态并根据颜色更改,所以现在我这样做:
var brush = (e.State & DrawItemState.Focus) == DrawItemState.Focus ?
Brushes.DodgerBlue :
item.BackgroundColor;
e.Graphics.FillRectangle(brush, e.Bounds.X,
e.Bounds.Y, e.Bounds.Width,
e.Bounds.Height);
这样,当我单击/选择一个项目并且组合框关闭后,当我将物品悬停在物品上时,它将正确地具有不同的颜色,该项目将保留焦点颜色而不是项目颜色,同样适用于{ {1}}状态,Selected
似乎无法正常工作,因为它永远不会触发。
我怎么能这样做只会在下拉菜单中悬停在项目上时使用焦点颜色,并在选择项目时使用正确的项目颜色?
答案 0 :(得分:0)
好吧,显然问题不在于平局,而是控制重点。
我作为一种解决方法所做的是覆盖我的CustomComboBox
OnSelectedIndexChanged
事件,如下所示:
protected override void OnSelectedIndexChanged(EventArgs e)
{
base.OnSelectedIndexChanged(e);
if (Focused)
{
Parent.Focus();
}
}
并将焦点设置为父控件,从而使项目在选中后具有原始颜色。
如果有合适的解决方案,除了使用父控件设置焦点外,我很乐意听到。