Winforms Windows窗体:手动绘制组合框的SelectedItem

Winforms Windows窗体:手动绘制组合框的SelectedItem,winforms,combobox,ondrawitem,Winforms,Combobox,Ondrawitem,我有一个组合框(更准确地说是ToolStripCombobox),里面填充了KeyValuePair类型的项。我设法使用DrawItem事件手动绘制项目。因此,每个项目都使用相应KeyValuePair的FontFamily绘制。这对于DropDownList很好,但当我从列表中选择一个项目并关闭列表时,组合框中的文本会显示类似“[21,[FontFamily:Name=Arial]]”的内容,这很可能是SelectedItem.ToString()的结果 有没有办法解决这个问题 以下是我的自定

我有一个组合框(更准确地说是ToolStripCombobox),里面填充了
KeyValuePair
类型的项。我设法使用DrawItem事件手动绘制项目。因此,每个项目都使用相应KeyValuePair的FontFamily绘制。这对于DropDownList很好,但当我从列表中选择一个项目并关闭列表时,组合框中的文本会显示类似“[21,[FontFamily:Name=Arial]]”的内容,这很可能是SelectedItem.ToString()的结果

有没有办法解决这个问题

以下是我的自定义DrawItem方法的代码:

private void fontComboBoxDrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawBackground();
            if ((e.State & DrawItemState.Focus) != 0)
            {
                e.DrawFocusRectangle();
            }
            Brush objBrush = null;

            var itemToDraw = this.fontComboBox.Items[e.Index];

                KeyValuePair<Int32, FontFamily> windowsFontItem = (KeyValuePair<Int32, FontFamily>)itemToDraw;
                objBrush = new SolidBrush(e.ForeColor);
                e.Graphics.DrawString(windowsFontItem.Value.Name, new Font(windowsFontItem.Value, e.Font.Size), objBrush, e.Bounds);
            if (objBrush != null)
            {
                objBrush.Dispose();
            }
            objBrush = null;
        }
private void fontcomboxDrawItem(对象发送方,DrawItemEventArgs e)
{
e、 牵引杆接地();
如果((e.State和DrawItemState.Focus)!=0)
{
e、 DrawFocusRectangle();
}
笔刷objBrush=null;
var itemToDraw=this.fontComboBox.Items[e.Index];
KeyValuePair windowsFontItem=(KeyValuePair)itemToDraw;
objBrush=新的SolidBrush(如前景色);
e、 Graphics.DrawString(windowsFontItem.Value.Name,新字体(windowsFontItem.Value,e.Font.Size),objBrush,e.Bounds);
if(objBrush!=null)
{
objBrush.Dispose();
}
objBrush=null;
}
更新:

当我将ComboBox的DropDownStyle设置为
ComboBoxStyle.DropDownList


但是我宁愿使用
ComboxStyle.DropDown
,这样你就可以编辑文本来搜索字体了。

你就是做不到。自定义图形仅对下拉列表实施。但不适用于文本框,因此也不适用于组合框的文本框部分。这一限制已经存在了30年,当时Windows必须在非常有限的硬件上运行。他们不得不通过作弊使编辑控件响应,并在不使用WM_PAINT的情况下进行绘制。三十年的appcompat,编辑控件被黑客以任何可能的方式攻击,阻止他们修复它。从代码片段看,这不是很明显的原因,看起来你只需要更改字体属性。不幸的是,我有点被迫使用Windows窗体。所以我会选择ComboBoxStyle.DropDownList解决方案,但你不能。自定义图形仅对下拉列表实施。但不适用于文本框,因此也不适用于组合框的文本框部分。这一限制已经存在了30年,当时Windows必须在非常有限的硬件上运行。他们不得不通过作弊使编辑控件响应,并在不使用WM_PAINT的情况下进行绘制。三十年的appcompat,编辑控件被黑客以任何可能的方式攻击,阻止他们修复它。从代码片段看,这不是很明显的原因,看起来你只需要更改字体属性。不幸的是,我有点被迫使用Windows窗体。所以我会选择ComboBoxStyle.DropDownList解决方案。