Я создаю пользовательский элемент управления, полученный из UserControl, на который я хотел бы установить фокус.
Пользовательский элемент управления содержит управление ComboBox, и я тяну некоторые строки около него.
ComboBox может получить фокус, но я хотел бы иметь возможность установить фокус на сам UserControl. Мой обработчик OnPaint настраивается для рисования управления немного по-другому, если это фокусируется, но я называю CanFocus () от родительской формы, когда я создаю свой пользовательский элемент управления, и это возвращает false.
Существует ли свойство или что-то для установки?
UserControl будет бороться изо всех сил, чтобы не попасть в фокус. В нем есть код, который автоматически передает фокус дочернему элементу управления (если есть), если он действительно получает фокус. Вам как минимум придется переопределить WndProc () и перехватить сообщение WM_SETFOCUS. Может потребоваться другая операция, например ControlStyles.Selectable и свойства TabStop и TabIndex.
Ваша следующая проблема заключается в том, что UserControl не будет адекватно реагировать, скажем, на сообщения клавиатуры, когда у него есть фокус. Вам нужно будет обнаруживать щелчки на фоне UC для обработки сообщений мыши, а также переопределить отрисовку, чтобы пользователю было очевидно, что UC находится в фокусе (используйте ControlPaint.DrawFocusRectangle). Если это начинает казаться непривлекательным, это потому, что UC действительно задумывался как контейнерный элемент управления.
Из http://msdn.microsoft.com/en-us/library/system.windows.forms.control.canfocus.aspx
Примечания
Чтобы элемент управления получил фокус ввода , элементу управления должен быть назначен дескриптор , а свойства Visible и Enabled должны быть имеет значение true как для элемента управления, так и для всех его родительских элементов управления , а элемент управления должен быть формой или внешний родительский элемент управления должен быть {{ 1}} форма.
Убедитесь, что вы выполнили эти предварительные требования.
слишком длинно для комментария, включает ссылку и код... но это комментарий...
Многие люди жаловались на то, что UserControl не срабатывает на событие 'GotFocus(). Например: UserControl и GotFocus() К сведению: LostFocus() срабатывает, как и ожидалось, по моему опыту. В прошлом, в проекте с несколькими формами, я экспериментировал с реализацией обработчиков событий 'Enter и 'Leave на UserControl в каждой форме, и обнаружил, что 'Enter вызывается только при загрузке формы, один раз.
Очевидно, что элементы управления на UserControl "принимают фокус" (каким-то образом я не могу объяснить, но, возможно, один из гуру SO по WinForms объяснит). Возможно, это связано с тем, что UserControl происходит от ContainerControl?
Я экспериментировал с написанием одного обработчика 'GotFocus() :
private void Control_GotFocus(object sender, EventArgs e)
{
Console.WriteLine("Control GotFocus : " + ((sender as Control).Name));
}
А затем, в событии UserControl 'Load, подключил все контролы UserControl к этому обработчику: я заметил, что контрол UserControl с наименьшим TabIndex вызывал событие 'GotFocus только при запуске приложения и при переключении между формами.
Единственное, что я видел в этой ситуации, это убедиться, что свойство 'IsTabStop контрола UserControl установлено в 'True : это было сказано Шоном Вилдермутом из MS в контексте вопроса, связанного с SilverLight, поэтому не знаю, применимо ли это в вашем случае.
Еще одно предложение - написать обработчик событий MouseDown или MouseClick для UserControl, и в нем вызвать: this.SetFocus();
привело меня в никуда.
Надеюсь, вы получите ответ!