в WinForms можно контролировать смену фокуса "автоматически"? если да, могу ли я как-то отличить это от изменения фокуса, вызванного пользователем? - PullRequest
2 голосов
/ 28 ноября 2009

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

Ну, во-первых, кто-нибудь может дать экспертную оценку по этому вопросу? А также, если действительно возможно изменение фокуса без явного порядка от меня (будь то действие пользователя или программирование), можно ли программно различить результирующие события Leave и Enter? То есть я хотел бы программно противодействовать событиям Leave / Enter, не вызванным мной, но я все же хочу позволить пользователю нормально менять фокус в рамках работы с GUI.

Ответы [ 2 ]

4 голосов
/ 28 ноября 2009

Да, это может случиться. Вероятно, это ContainerControl, который портит ваш фокус, форма получена из него. ContainerControl отправляется на поиски элемента управления для фокусировки, когда он получает событие активации. Ему нравятся вложенные дочерние элементы управления, он обязательно пропустит вашу панель, если у нее есть какие-либо элементы управления.

Логика, используемая в WF для обработки фокуса, очень сложна, прежде всего из-за проверки. Лучше всего избегать неприятностей и избегать фокусирования на панели. Он не предназначен для фокусируемого управления, у него нет способа указать фокус пользователю. Это обеспечивается тем, что стиль ControlStyles.Selectable отключен, а для свойства TabStop установлено значение false, поэтому пользователь никогда не сможет сфокусировать его, нажимая вкладки или щелкая.

Событие Enter не поможет, Panel получает Enter, когда получает фокус или когда один из его дочерних элементов управления получает фокус. Либо с помощью вкладок пользователя, либо при использовании метода Focus (). Вам придется подождать, пока все события фокуса не завершатся, что вы можете сделать с помощью Control.BeginInvoke () или Timer.

Ну, я уверен, что это мало поможет, но описание вашей проблемы нечеткое. Лучший способ продолжить - опубликовать пример проекта, который демонстрирует такое поведение, в службе общего доступа к файлам или, как указано, избегать попыток сосредоточить внимание на родительском контроле.

0 голосов
/ 17 сентября 2010

Следует иметь в виду, что многие элементы управления winforms не могут быть сфокусированы вообще - winforms предоставляет свойство CanFocus, чтобы указать это. Для панелей CanFocus установлено значение false, поэтому невозможно сфокусироваться непосредственно на панели без использования производного класса, который устанавливает для этого свойства значение true.

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