可变大小的所有者绘制ComboBox; 列表没有正确调整大小

got*_*pie 5 .net c# combobox winforms

我从ComboBox派生了一个类,使其成为一个所有者绘制的列表框(DrawMode.OwnerDrawVariable样式),并通过重写OnMeasureItem和OnDrawItem,我将特殊项添加到下拉列表(例如,分隔符)中,它们更小/更大大小比控制中的常规项目大.

现在,我遇到并且似乎无法有效解决的问题是下拉列表的大小调整:当列表下降时,列表末尾有一个丑陋的空白区域.我想我通过设置组合框的所有项目高度的总和的DropDownHeight财产解决这一问题,但是似乎并没有工作,所有的时间.有时,在随机数量的项目上,空白空间的厄运会返回.这是一个不寻常的问题,但希望是一个常见且易于修复的问题.

如何让ComboBox的下拉列表精确调整到其内部项目占用的大小?

Han*_*ant 4

我在 ComboBox.UpdateDropDownHeight() 方法中看到一个非常愚蠢的错误。当 DropDownHeight 属性与默认值匹配时,它会计算自定义高度以使下拉列表适合项目数量。即使您更改了 DrawMode,它也会这样做,这是完全错误的。

解决方法:

  int height = ...; // Your code here
  if (height == 106) ++height;
  comboBox1.DropDownHeight = height;
Run Code Online (Sandbox Code Playgroud)

您将得到一个像素间隙,您应该能够将其隐藏在 OnDrawItem() 重载中。