Предотвратить запуск LostFocus, когда дочерние элементы теряют фокус

У меня есть пользовательский элемент управления, который имеет несколько дочерних элементов, включая флажки и текстовые поля.

Я хотел бы инициировать событие LostFocus для моего пользовательского элемента управления только, когда фокус теряется на всем пользовательском элементе управления (например, при нажатии кнопки вне пользовательского элемента управления).

В настоящее время событие LostFocus также запускается, когда я перемещаюсь между дочерними элементами моего пользовательского элемента управления, например. из одного текстового поля в другое.


person binncheol    schedule 19.03.2013    source источник


Ответы (1)


protected override void OnLostFocus(EventArgs args)
{
      if (!ContainsFocus)
      {
          // Only do something here
      }
}

Хитрость заключается в том, чтобы проверить наличие содержимого фокуса.

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

CaptureLostFocus(this);

и реализация:

void CaptureLostFocus(Control control)
{
      foreach(Control child in control.Controls)
      {
           child.LostFocus += (s, e) => OnLostFocus(e);
           CaptureLostFocus(control);
      }
}
person Jens Meinecke    schedule 19.03.2013
comment
Из того, что я вижу, в WPF нет ContainsFocus для проверки. - person binncheol; 19.03.2013
comment
Я не думаю, что в элементе управления есть свойство Controls. - person Ben; 09.09.2017
comment
Как за это не проголосовали? Похоже, речь идет о winforms, а не о wpf. - person person27; 18.10.2017