ActiveControl скрыт - PullRequest
       3

ActiveControl скрыт

1 голос
/ 05 апреля 2019

Чтобы свести ситуацию к минимуму, у меня есть панель с 3 текстовыми полями.Когда я скрываю панель, первое текстовое поле в порядке вкладок для панели назначается Me.ActiveControl (форма), независимо от того, какое из них было сфокусировано, когда панель была скрыта.

Я думал, что скрытый элемент управленияникогда не мог сосредоточиться.У меня есть другие элементы управления в моей форме, где проблема была первоначально обнаружена, поэтому я подумал, что нужно будет выбрать не скрытый элемент управления, чтобы сосредоточиться.Это ошибка, или она спроектирована таким образом?

Я использую таймер в моей простой форме, которая срабатывает каждые 5 секунд, записывая имя активного элемента управления в метке.

1 Ответ

0 голосов
/ 05 апреля 2019

Мне удалось воссоздать ваш сценарий, и он обнаружил интересную возможность (подробнее об этом позже).

WinForms имеет концепцию Выбранный (или активированный) элемент управления. Метод Control.Select связан с Методом Control.Focus . * * * * * * * * * * * * * * * * Документация .

Элемент управления можно выбрать и получить фокус ввода, если все следующие true: выбираемое значение ControlStyles установлено в true, это содержится в другом элементе управления, и все его родительские элементы управления являются видимый и включенный.

...

Фокус - это низкоуровневый метод, предназначенный главным образом для пользовательского управления. авторы. Вместо этого прикладные программисты должны использовать метод Select или свойство ActiveControl для дочерних элементов управления, или активировать метод для форм.

Свойство

ContainerControl.ActiveControl указывает на последний выбранный элемент управления.

Причина выбора первого порядка управления по табуляции в Panel связана с кодом, который выполняется, когда для свойства Panel.Visible установлено значение false. Видимое свойство вызывает сеттер SetVisibleCore , которое, в свою очередь, вызывает SelectNextIfFocused , которое вызывает SelectNextControlInternal , которое, наконец, вызывает Control.SelectNextControl который выбирает ваш TextBox1.

Вот где это становится интересным. На этом этапе Panel и TextBox оба видны. Поэтому TextBox получает фокус и сохраняет его, когда Panel скрыт. Это условие позволяет скрытому TextBox иметь ввод с клавиатуры, и никакие правила о скрытом элементе управления, который не может получить фокус, нарушаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...