Ответ 1
В вашем конструкторе после InitializeComponent()
вам нужно вызвать SetStyle
и установить ControlStyles.Selectable
- false
:
SetStyle(ControlStyles.Selectable, false);
Есть ли способ сделать UserControl незащищенным?
EDIT:
Итак SetStyle(ControlStyles.Selectable, false)
- это путь. Но все же есть разница с Control
. Если вы наследуете форму Control
, исходный элемент управления не теряет фокус. Но после нажатия на ваш элемент управления, который получен из UserControl
и
ControlStyles.Selectable
применяется фокус удаляется из начального управления.
В вашем конструкторе после InitializeComponent()
вам нужно вызвать SetStyle
и установить ControlStyles.Selectable
- false
:
SetStyle(ControlStyles.Selectable, false);
Помимо ControlStyles.Selectable существует также ControlStyles.ContainerControl - документация довольно разрежена в этой теме (если true, элемент управления - это контейнерный элемент управления), но он каким-то образом влияет на то, что дочерние элементы управления получают фокус вместо самого элемента управления.
EDIT:
Я только что заметил еще один интересный факт. Просмотр индикатора UserControl в отражателе показывает, что он принудительно устанавливает фокус ввода в OnMouseDown. Поэтому переопределение OnMouseDown без вызова base.OnMouseDown(e) устраняет проблему без побочных эффектов.
[EditorBrowsable(EditorBrowsableState.Advanced)]
protected override void OnMouseDown(MouseEventArgs e)
{
if (!this.FocusInside())
{
this.FocusInternal();
}
base.OnMouseDown(e);
}
Да, SetStyle (ControlStyles.Selectable, false); работает только в том случае, если вы наследуете элемент управления.
Это не сработает, если вы наследуете пользовательский элемент управления.
Чтобы обойти эту проблему, я добавил панель к пользовательскому элементу управления и состыковал панель с надписью "Заполнить". Добавлены остальные элементы управления на панель вместо пользовательского элемента управления. Это сработало!
UserControl или любой элемент управления не смогут получать фокус, если свойство CanFocus возвращает false. Если вы посмотрите на код в рефлекторе, он в основном проверяет 3 свойства и, если они есть, то они будут неактивными.
Установка первых двух в false и наличие управляющего элемента - это в значительной степени противоречие. Если это возможно, хотя для вашего контроля будет функционировать с IsEnabled, являющимся false, это должно работать.
Enabled = false, возможно?
Вы можете приблизиться к тому, что хотите, установив TabStop на false. Это предотвратит фокусировку элемента управления, если, например, закрывается диалоговое окно над его собственной формой.