C#: Как подавить UserControl, чтобы сосредоточиться на первом дочернем элементе управления?

У меня есть UserControl, который может иметь childcontrol.

У usercontrol есть стили:

this.SetStyle(
            ControlStyles.AllPaintingInWmPaint |
            ControlStyles.OptimizedDoubleBuffer |
            ControlStyles.Selectable |
            ControlStyles.SupportsTransparentBackColor |
            ControlStyles.UserPaint,
            true);

Теперь, если я нажимаю на usercontrol (не дочерний элемент управления), я хочу, чтобы usercontrol сохранял фокус, но фокус автоматически переходит к первому дочернему элементу управления. То же самое происходит, если я использую клавишу табуляции.

я уже пытался переопределить OnGotFocus безуспешно.

Любая идея?

1 ответ

Решение

Это жестко запрограммированное поведение внутри класса UserControl, оно перехватывает сообщение WM_SETFOCUS и передает фокус дочернему элементу управления. Я не знаю, как это переопределить, даже перехват в WndProc() не работает, поскольку нет хорошего способа заставить базовый класс UC справиться с этим.

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

Другие вопросы по тегам