Есть ли способ сделать UserControl не подлежащим обсуждению? - PullRequest
11 голосов
/ 24 апреля 2009

Есть ли способ сделать UserControl не подлежащим обсуждению?

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

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

ControlStyles.Selectable

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

Ответы [ 6 ]

12 голосов
/ 24 апреля 2009

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

SetStyle(ControlStyles.Selectable, false);
5 голосов
/ 03 февраля 2015

Помимо 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);
}
2 голосов
/ 13 января 2010

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

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

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

1 голос
/ 24 апреля 2009

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

  • IsHandleCreated
  • IsVisible
  • IsEnabled

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

0 голосов
/ 03 октября 2014

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

0 голосов
/ 24 апреля 2009

Включено = ложь, возможно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...