选择项目后焦点颜色保持不变

Focus color remains after item is selected

我制作了自己的 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 class 如下:

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

这样,当我悬停在项目上时,它会正确地具有不同的颜色,不幸的是,在我 click/select 一个项目并且组合框关闭后,该项目将保留焦点颜色而不是项目颜色, Selected 状态也是如此,并且 HotLight 似乎根本不起作用,因为它永远不会触发。

我该怎么做才能在下拉菜单打开时将鼠标悬停在项目上时仅使用焦点颜色,并在选择项目时使用正确的项目颜色?

好的,显然问题不在于平局,而在于控制被聚焦。

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

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

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

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