手动绘制项目时 ComboBox 样式的更改

4
我在这里遇到了一个奇怪的问题,我的组合框从 DropDownList样式变成DropDown,只是在视觉上改变。检查我的组合框的DropDownStyle属性显示为DropDownList
基本上这是我正在做的事情:
void InitComponents()
{
            ddlInterval.DrawMode = DrawMode.OwnerDrawFixed;
            ddlInterval.DrawItem += new DrawItemEventHandler(DrawIntervalItems);
            List<IntervalItem> backupIntervalsList = new List<IntervalItem>();
            IntervalsList.Add(new IntervalItem(5, GetIntervalString(5)));
            IntervalsList.Add(new IntervalItem(15, GetIntervalString(15)));
            IntervalsList.Add(new IntervalItem(30, GetIntervalString(30)));
            IntervalsList.Add(new IntervalItem(60, GetIntervalString(60)));
            IntervalsList.Add(new IntervalItem(120, GetIntervalString(120)));
            IntervalsList.Add(new IntervalItem(240, GetIntervalString(240)));
            IntervalsList.Add(new IntervalItem(480, GetIntervalString(480)));
            IntervalsList.Add(new IntervalItem(720, GetIntervalString(720)));
            IntervalsList.Add(new IntervalItem(1440, GetIntervalString(1440)));
            ddlInterval.DataSource = IntervalsList;
            ddlInterval.DisplayMember = "Name";
            ddlInterval.ValueMember = "Value";
}

 void DrawIntervalItems(object sender, DrawItemEventArgs e)
        {
            if(_bDisableItems)
            {
                switch (e.Index)
                {
                    case 5:
                    case 7:
                    case 8:
                        {
                            string s = ddlInterval.GetItemText(ddlInterval.Items[e.Index]);
                            e.DrawBackground();
                            e.Graphics.DrawString(s, ddlInterval.Font, Brushes.Black, e.Bounds);
                        }
                        break;
                    default:
                        {

                            string s = ddlInterval.GetItemText(ddlInterval.Items[e.Index]);
                            e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds);
                            e.Graphics.DrawString(s, ddlInterval.Font, Brushes.LightSlateGray, e.Bounds);
                        }
                        break;
                }
            }
        }

这里有一张图片展示了两个combobox之间的区别。请注意,两者的DropDownStyle属性都设置为DropDownList,但只有底部的一个手动绘制了其项: comboboxes之间的差异 是否有方法可以解决这个问题?

您可能可以利用 ComboBoxRenderer 类来正确绘制控件。首先确保检查 Application.RenderWithVisualStyles。 (编辑:更好的方法是像示例代码一样检查 ComboBoxRenderer.IsSupported。我忽略了此属性。) - JosephHirn
1个回答

0

尝试这段代码:

 ddlInterval.DrawMode = DrawMode.Normal;

改为:

 ddlInterval.DrawMode = DrawMode.OwnerDrawFixed;

如果我将drawMode设置为normal,那么DrawItem事件将不会被触发。 - Zaid Amir
你只为ddlBackupInterval设置了DrawItem事件,而没有为ddlInterval设置吗? - Praveen VR
抱歉,那是一个打字错误,ddlBackupInterval 和 ddlInterval 是同一个东西。 - Zaid Amir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接