У меня есть 50 UserControls, которые я добавляю в flowlayoutPanel динамически. Мне нужно установить фокус на пользовательский элемент управления, но это не работает. Я много искал, но не могу найти ни одного примера, который был бы мне понятен.
Единственный пример, который я нашел, это https://stackoverflow.com/questions/2362428/setting-focus-to-a-net-usercontrol
Я пытался использовать userCtrl.Focus(); но это не сработало. Как я читал, usercontrol не любит иметь фокус.
Дополнение: Теперь, когда я больше понимаю класс
Control
, я понимаю, что если вы производны отControl
, то не должны подписываться на его события. на его события, а использовать функции On..., напримерOnEnter
. Я > изменил изменил свой ответ соответствующим образом
Для активации любого Control
, включая UserControl
, используйте Control.Select()
.
Если вы сделаете это для TextBox
, вы увидите, что Select
гарантирует, что он получит фокус ввода.
Я предполагаю, что вы хотите что-то сделать с выбранным UserControl
(Control
, который имеет фокус), например, вы хотите изменить его внешний вид или выбрать любой из элементов управления на нем. Для этого ваш класс UserControl
должен подписаться на события Control.Enter и Control.Leave
Я создал UserControl
с CheckBox
, который автоматически устанавливается, когда UserControl
выбран (имеет фокус ввода):
Добавление: Если вы создаете элемент управления, не подписывайтесь на события Enter
и Leave
. Вместо этого переопределите функции, которые вызывают эти события: OnEnter / OnLeave.
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
protected override void OnEnter(EventArgs e)
{
this.checkBox1.Checked = true;
base.OnEnter(e); // this will raise the Enter event
}
protected override void OnLeave(EventArgs e)
{
this.checkBox1.Checked = false;
base.OnLeave(e); // this will raise the Leave event
}
}
У меня есть форма с кнопкой и обработчиком событий, который вызывается при нажатии на кнопку:
private void OnButton1Clicked(object sender, EventArgs e)
{
this.userControl1.Select();
}
Теперь, когда кнопка нажата, я вижу, что пользовательский элемент управления получает фокус, потому что флажок установлен, а когда я нажимаю на другое место, флажок снимается.
Хотя вы не описали подробно, что значит не работает, фокусировка имеет много аспектов условно.
1. Явная фокусировка
Вызов метода Focus()
элемента управления - это то же самое, что установка ActiveControl
контейнерной формы. Если CanFocus
возвращает true (ваш элемент управления и все его родители видны и включены), это работает; однако, у вас не будет визуальной обратной связи, кроме некоторых косвенных подсказок, например, первоначально сфокусированный элемент управления (кнопка или текстовое поле) теряет фокус.
Для визуализации состояния фокуса вы можете использовать некоторые пользовательские краски:
protected override void OnPaintBackground(PaintEventArgs e)
{
e.Graphics.Clear(Focused ? SystemColors.Highlight : SystemColors.Control);
}
Если вы используете непосредственно Control
, а не UserControl
, переопределите следующие два метода для принудительной перерисовки при изменении состояния фокуса:
protected override void OnGotFocus(EventArgs e)
{
Invalidate();
base.OnGotFocus(e);
}
protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus(e);
Invalidate();
}
2. Фокусировка с помощью мыши
Чтобы получить фокус при щелчке по элементу управления, добавьте эту строку в конструктор:
SetStyle(ControlStyles.Selectable, true);
Если вы берете непосредственно Control
, а не UserControl
, переопределите и OnMouseDown
:
protected override void OnMouseDown(MouseEventArgs e)
{
if (!Focused)
Focus();
base.OnMouseDown(e);
}
3. Фокусировка с помощью клавиатуры
Чтобы получить фокус по клавише TAB, просто установите свойство TabStop
в true
и настройте свойство TabOrder
.
Вы можете установить фокус на элемент управления с помощью свойства ActiveControl.
this.ActiveControl = myUserControl;