Узнайте, кто получил фокус в событии Lost Focus - PullRequest
9 голосов
/ 24 мая 2010

Можно ли узнать, кто получил фокус в событии с потерянным фокусом?

В Compact Framework нет ActiveControl, поэтому я не знаю, как определить, кто получил фокус.

Ответы [ 5 ]

6 голосов
/ 25 мая 2010

Это решение сработало:

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!
}
2 голосов
/ 24 мая 2010

Одним из вариантов будет взаимодействие API GetFocus

[DllImport("coredll.dll, EntryPoint="GetFocus")]
public extern static IntPtr GetFocus();

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

1 голос
/ 11 августа 2014

Это более короткий код для ответа Vaccano, используя Linq

private static Control FindFocusedControl(Control container)
{
    foreach (Control childControl in container.Controls.Cast<Control>().Where(childControl => childControl.Focused)) return childControl;
    return (from Control childControl in container.Controls select FindFocusedControl(childControl)).FirstOrDefault(maybeFocusedControl => maybeFocusedControl != null);
}

Точно так же (в высоком уровне, абстракция).

1 голос
/ 25 мая 2010

Использование corell.dll выглядит хорошей идеей.

Другим возможным способом является создание обработчиков событий GotFocus для всех элементов управления в вашей форме. Затем создайте переменную уровня класса, которая обновляется с именем элемента управления, имеющего текущий фокус.

1 голос
/ 24 мая 2010

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

Edit: ОК Вы опубликовали решение, и оно работает нормально. Я должен признать: простое «Нет» - это неправильно + 1

...