Установка фокуса к.NET UserControl …?

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

Пользовательский элемент управления содержит управление ComboBox, и я тяну некоторые строки около него.

ComboBox может получить фокус, но я хотел бы иметь возможность установить фокус на сам UserControl. Мой обработчик OnPaint настраивается для рисования управления немного по-другому, если это фокусируется, но я называю CanFocus () от родительской формы, когда я создаю свой пользовательский элемент управления, и это возвращает false.

Существует ли свойство или что-то для установки?

12
задан Sambo 2 March 2010 в 10:29
поделиться

3 ответа

UserControl будет бороться изо всех сил, чтобы не попасть в фокус. В нем есть код, который автоматически передает фокус дочернему элементу управления (если есть), если он действительно получает фокус. Вам как минимум придется переопределить WndProc () и перехватить сообщение WM_SETFOCUS. Может потребоваться другая операция, например ControlStyles.Selectable и свойства TabStop и TabIndex.

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

22
ответ дан 2 December 2019 в 06:08
поделиться

Из http://msdn.microsoft.com/en-us/library/system.windows.forms.control.canfocus.aspx

Примечания

Чтобы элемент управления получил фокус ввода , элементу управления должен быть назначен дескриптор , а свойства Visible и Enabled должны быть имеет значение true как для элемента управления, так и для всех его родительских элементов управления , а элемент управления должен быть формой или внешний родительский элемент управления должен быть {{ 1}} форма.

Убедитесь, что вы выполнили эти предварительные требования.

1
ответ дан 2 December 2019 в 06:08
поделиться

слишком длинно для комментария, включает ссылку и код... но это комментарий...

Многие люди жаловались на то, что 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(); привело меня в никуда.

Надеюсь, вы получите ответ!

1
ответ дан 2 December 2019 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: