Windows Forms: обнаружение смены сфокусированного элемента управления - PullRequest
3 голосов
/ 21 июля 2009

Я реализую копирование-вставку в приложении Windows Forms. Мне нужно включить / отключить линейные кнопки для этих двух операций, когда пользователь меняет фокусированный элемент в приложении.

Я могу найти текущий фокусированный элемент управления, используя что-то вроде этого: http://www.syncfusion.com/FAQ/windowsforms/faq_c41c.aspx#q1021q,, но как я могу обнаружить, что фокусированный элемент управления изменился?

Ответы [ 4 ]

9 голосов
/ 21 июля 2009

В вашем обработчике загрузки формы вы также можете перебрать все элементы управления, содержащиеся в форме, и для каждого фокусируемого элемента управления добавить обработчик события для события Enter:

    private void Form1_Load(object sender, EventArgs e)
    {
        foreach (Control control in Controls)
        {
            control.Enter += ControlReceivedFocus;
        }
    }

    void ControlReceivedFocus(object sender, EventArgs e)
    {
        Debug.WriteLine(sender + " received focus.");
    }
2 голосов
/ 21 июля 2009

Мое предложение - использовать событие Application.Idle.

  • Напишите логику, которая включает / отключает ваши кнопки в событии Application.Idle.
  • Подписаться на событие Application.Idle в отображаемой форме.
  • Проверка доступности кнопки при нажатии кнопки (чтобы вы никогда не пропустили случайный щелчок при большой нагрузке)
  • Не забудьте удалить обработчик простоя при удалении (или закрытии) формы, потому что это статическое событие

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

1 голос
/ 21 июля 2009

Я думаю, что вы должны добавить обработчик событий в элемент управления (или, если у вас много таких же типов, создать подкласс и переопределить соответствующий обработчик OnChange). Таким образом, вам не придется «находить» сфокусированный элемент управления (он будет задан в качестве параметра отправителя), и событие возникнет только тогда, когда изменение действительно произошло.

0 голосов
/ 01 декабря 2016

Чтобы определить фокус на элементе управления, вы можете создать это событие:

void MyGotFocus(object sender, EventArgs e)
{
    if (sender is TextBox)
    {
        //TODO YOUR OPERATION
        //FOR EXAMPLE
        (sender as TextBox).SelectAll();
    }
}

и следующий шаг - связать управление и событие по коду:

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