Действительно ли возможно знать, кто получил фокус в потерянном событии фокуса?
Компактная Платформа не имеет ActiveControl
, таким образом, я не знаю, как сказать, кто получил фокус.
Это решение, которое в итоге сработало:
public System.Windows.Forms.Control FindFocusedControl()
{
return FindFocusedControl(this);
}
public static System.Windows.Forms.Control FindFocusedControl(System.Windows.Forms.Control container)
{
foreach (System.Windows.Forms.Control childControl in container.Controls)
{
if (childControl.Focused)
{
return childControl;
}
}
foreach (System.Windows.Forms.Control childControl in container.Controls)
{
System.Windows.Forms.Control maybeFocusedControl = FindFocusedControl(childControl);
if (maybeFocusedControl != null)
{
return maybeFocusedControl;
}
}
return null; // Couldn't find any, darn!
}
Нет. сначала идет событие LostFocus одного элемента управления, затем событие GotFocus следующего элемента управления. пока вы не можете понять, какой элемент управления использует пользователь в следующий момент, это невозможно.
тогда как, если у компактного фреймворка есть свойство TabIndex, его можно предсказать, только если пользователь использует клавишу табуляции.
Изменить: ОК Вы опубликовали решение, и оно работает нормально, я должен признать: простое «Нет» неверно +1
Один из вариантов - взаимодействие с GetFocus API
[DllImport("coredll.dll, EntryPoint="GetFocus")]
public extern static IntPtr GetFocus();
. Это даст вам дескриптор окна, которое в настоящее время имеет фокус ввода. Затем вы можете рекурсивно перебирать дерево элементов управления, чтобы найти элемент управления с помощью эту ручку.
Использование corell.dll выглядит хорошей идеей.
Другой возможный способ - создать обработчики события GotFocus для всех элементов управления на вашей форме. Затем создайте переменную уровня класса, которая будет обновлять имя элемента управления, имеющего текущий фокус.