【问题标题】:How can I reduce the DropDownHeight of a ComboBox?如何减少组合框的 DropDownHeight?
【发布时间】:2011-10-13 07:14:09
【问题描述】:
我通过扩展 WinForm 组合框实现了自动完成功能。我现在要做的是减少打字时的下拉高度。
我尝试过类似的东西:
this.DropDownHeight = this.ItemHeight * this.Items.Count
在KeyUp事件处理程序的末尾,但结果很奇怪。
我该如何解决这个小问题?
【问题讨论】:
标签:
c#
.net
winforms
autocomplete
combobox
【解决方案1】:
DropDownHeight 属性控制组合框下拉时的高度。
(是的,你说,这很明显!)
但这与自动完成建议列表不相同。
(什么?它们看起来一样;它们都是下拉列表!)
是的,他们是。但是它们在幕后的实现方式完全不同。下拉组合框与下拉部分永久显示在屏幕上的“完整”组合框(WinForms 中称为“简单”的样式)相同。唯一的区别是,对于“DropDown”或“DropDownList”样式,下拉部分是隐藏的,只有在用户请求时才显示。 (A comparison of various combo box styles.) 这种风格的初衷是为了节省屏幕空间,但现在它变得如此流行,以至于每个人都改用它,即使屏幕空间不再是一个问题。
这意味着下拉项目列表没有改变。 Windows 不会重复使用相同的下拉列表来显示自动完成建议。这是根据需要创建和销毁的完全不同的弹出窗口。最大的问题是自动完成建议列表是可调整大小的。它有一个在角落里调整抓手的大小。常规的下拉列表没有这个,所以它们显然不能是一回事。从技术上讲,自动完成建议列表由 shell IAutoCompleteInterface 实现,与所有编辑控件使用的相同。 (在 this one 之类的错误中发现了另一个死掉的赠品。)
所以您实际上需要更改自动完成建议列表的下拉高度!但不幸的是,WinForms 并没有为此公开任何属性。
因此有理由得出结论,您可能一开始就不应该这样做。允许用户根据自己的选择调整自动完成建议框的大小。这就是调整大小抓手的用途。他们选择的最后一个尺寸会被记住并重复使用。始终尊重用户,即使您的设计部门认为他们可以做得“更好”。
当然,由于这是 Windows,如果您愿意亲自动手,有一种方法可以解决您的问题。自动完成建议列表仍然是一个窗口,因此它仍然有一个窗口句柄,并且 Windows 将允许您操作几乎任何您可以获得句柄的窗口。我不一定建议这样做,所以我会留给你on your own 来破解解决方案。请记住,当这样的功能未公开时,通常是出于某种原因而未公开。您的 hack 很可能会在未来版本的 Windows 上中断,shell 团队会在其中重新配置自动完成功能。几乎不值得支持麻烦。