Как я могу уменьшить DropDownHeight ComboBox? - PullRequest
2 голосов
/ 26 июля 2011

Я реализовал автозаполнение, расширив списки WinForm.Теперь я хочу уменьшить высоту выпадающего меню при наборе.

Я пробовал что-то вроде:

this.DropDownHeight = this.ItemHeight * this.Items.Count

в конце обработчика событий KeyUp, норезультат очень странный.

Как я могу решить эту маленькую проблему?

1 Ответ

5 голосов
/ 26 июля 2011

Свойство DropDownHeight контролирует высоту поля со списком при его раскрытии.

(Да, вы говорите, это очевидно!)

Но это , а не , то же самое, что список автозаполнений.

(Что? Они выглядят одинаково; они оба выпадающие списки предметов!)

Да, они есть. Но они реализованы совсем по-другому за кулисами. Выпадающее поле со списком аналогично «полному» поле со списком (стиль называется «Простой» в WinForms), где раскрывающаяся часть постоянно отображается на экране. Единственное отличие состоит в том, что в стилях «DropDown» или «DropDownList» раскрывающаяся часть скрыта и отображается только по запросу пользователя. ( Сравнение различных стилей комбо-боксов .) Изначальное намерение этого стиля состояло в том, чтобы сэкономить место на экране, но теперь он стал настолько популярным, что его используют все, даже если пространство на экране больше не является проблемой.

Это означает, что раскрывающийся список элементов не изменяется . Windows не использует тот же выпадающий список для отображения предложений автозаполнения. Это совершенно другое всплывающее окно, которое создается и уничтожается по мере необходимости. Недостатком является то, что список предложений автозаполнения изменяемого размера . У этого есть один из них там, захваты изменения размера в углу. Обычный выпадающий список не имеет этого, поэтому они явно не могут быть одним и тем же. Технически, список предложений автозаполнения реализуется оболочкой IAutoCompleteInterface и является тем же, который используется всеми элементами управления редактированием. (Еще одна мёртвая раздача найдена в багах вроде этот .)

Так что на самом деле необходимо изменить высоту раскрывающегося списка предложений автозаполнения! Но, к сожалению, WinForms не предоставляет никаких свойств для этого.

Таким образом, разумно сделать вывод, что вы, вероятно, не должны делать это в первую очередь. Разрешить пользователю изменять размер окна автозаполнения по своему усмотрению. Вот для чего нужен захват для изменения размера. Последний выбранный размер запоминается и используется повторно. Всегда уважайте пользователя, даже если ваш отдел дизайна думает, что он может сделать что-то «лучше».

Но, конечно, поскольку это Windows, есть способ исправить вашу проблему, если вы хотите испачкать руки. Список предложений автозаполнения по-прежнему является окном, поэтому у него все еще есть дескриптор окна, и Windows позволит вам управлять практически любым окном, для которого вы можете получить дескриптор. Я не обязательно предлагаю делать это, поэтому я оставлю вас на ваше усмотрение , чтобы взломать решение. Имейте в виду, что когда подобная функциональность не раскрывается, обычно она не раскрывается по определенной причине. Ваш хак, скорее всего, сломается в будущих версиях Windows, где команда оболочек переустанавливает функцию автозаполнения. Вряд ли стоит хлопот с поддержкой.

...