如何减少ComboBox的DropDownHeight?

jGo*_*ong 2 .net c# combobox autocomplete winforms

我已经通过扩展WinForm组合框实现了自动填充。我现在想做的是减少键入时的下拉高度。

我已经尝试过类似的东西:

this.DropDownHeight = this.ItemHeight * this.Items.Count
Run Code Online (Sandbox Code Playgroud)

KeyUp事件处理程序的末尾,但是结果很奇怪。

我该如何解决这个小问题?

Cod*_*ray 5

DropDownHeight属性控制组合框在下拉时的高度。

(是的,您说的很明显!)

但是,这是不是同样的事情的自动完成建议列表。

(什么?它们看起来相同;它们都是下拉的项目列表!)

对,他们是。但是它们在幕后的实现方式大不相同。下拉组合框与“完整”组合框(在WinForms中,样式称为“简单”)相同,下拉框永久显示在屏幕上。唯一的区别是,使用“ DropDown”或“ DropDownList”样式时,仅在用户请求时隐藏并显示下拉部分。(比较各种组合框样式。)这种样式的初衷是节省屏幕空间,但是现在它变得如此流行,以至于每个人都使用它,即使不再关心屏幕空间。

这意味着下拉项目列表不会更改。Windows不会重复使用相同的下拉列表来显示自动完成建议。这是根据需要创建和销毁的完全不同的弹出窗口。致命的遗漏是,自动完成建议列表的大小可调整。它的其中一个在角落有调整大小的抓手。常规下拉列表中没有此列表,因此它们显然不可能是同一个人。从技术上讲,自动完成建议列表由shell实现IAutoCompleteInterface,并且与所有编辑控件使用的列表相同。(在这种错误中还发现了另一条致命的赠品。)

因此,您实际上需要更改自动完成建议列表的下拉高度!但是不幸的是,WinForms不会公开任何属性。

因此,可以合理地得出一个结论,即您可能不应该一开始就这样做。允许用户根据需要调整自动完成建议框的大小。这就是调整大小的抓取器的用途。他们选择的最后一个大小会被记住并重新使用。即使您的设计部门认为他们可以做“更好”的事情,也要始终尊重用户。

但是当然,由于这是Windows,如果您愿意弄脏手,有一种解决问题的方法。自动完成建议列表仍然是一个窗口,因此它仍然具有窗口句柄,并且Windows将允许您操作几乎可以获取其句柄的任何窗口。我不一定建议您这样做,所以我会让您自己解决问题的方法。请记住,当这样的功能未公开时,由于某种原因通常不会公开。您的黑客行为可能会在Windows的未来版本上崩溃,在此版本中,shell团队将重新安装自动完成功能。几乎没有值得支持的麻烦。