选择项目后,焦点颜色仍然存在

时间:2016-02-16 13:44:52

标签: c# winforms combobox .net-4.5

我制作了自己的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似乎无法正常工作,因为它永远不会触发。

我怎么能这样做只会在下拉菜单中悬停在项目上时使用焦点颜色,并在选择项目时使用正确的项目颜色?

1 个答案:

答案 0 :(得分:0)

好吧,显然问题不在于平局,而是控制重点。

我作为一种解决方法所做的是覆盖我的CustomComboBox OnSelectedIndexChanged事件,如下所示:

protected override void OnSelectedIndexChanged(EventArgs e)
{
    base.OnSelectedIndexChanged(e);
    if (Focused)
    {
        Parent.Focus();
    }
}

并将焦点设置为父控件,从而使项目在选中后具有原始颜色。

如果有合适的解决方案,除了使用父控件设置焦点外,我很乐意听到。