Есть ли способ сделать UserControl незащищенным?

Есть ли способ сделать UserControl незащищенным?

EDIT: Итак SetStyle(ControlStyles.Selectable, false)

- это путь. Но все же есть разница с Control. Если вы наследуете форму Control, исходный элемент управления не теряет фокус. Но после нажатия на ваш элемент управления, который получен из UserControl и

ControlStyles.Selectable

применяется фокус удаляется из начального управления.

Ответ 1

В вашем конструкторе после InitializeComponent() вам нужно вызвать SetStyle и установить ControlStyles.Selectable - false:

SetStyle(ControlStyles.Selectable, false);

Ответ 2

Помимо 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);
}

Ответ 3

Да, SetStyle (ControlStyles.Selectable, false); работает только в том случае, если вы наследуете элемент управления.

Это не сработает, если вы наследуете пользовательский элемент управления.

Чтобы обойти эту проблему, я добавил панель к пользовательскому элементу управления и состыковал панель с надписью "Заполнить". Добавлены остальные элементы управления на панель вместо пользовательского элемента управления. Это сработало!

Ответ 4

UserControl или любой элемент управления не смогут получать фокус, если свойство CanFocus возвращает false. Если вы посмотрите на код в рефлекторе, он в основном проверяет 3 свойства и, если они есть, то они будут неактивными.

  • IsHandleCreated
  • IsVisible
  • IsEnabled

Установка первых двух в false и наличие управляющего элемента - это в значительной степени противоречие. Если это возможно, хотя для вашего контроля будет функционировать с IsEnabled, являющимся false, это должно работать.

Ответ 5

Enabled = false, возможно?

Ответ 6

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