Есть ли способ поймать, когда меняется ContainsFocus? - PullRequest
0 голосов
/ 06 декабря 2008

Мне нужно иметь возможность определить, когда ContainsFocus изменяется на Control (в частности, на форме окон). Переопределение OnGotFocus не является ответом. Когда я вывожу форму на передний план, ContainsFocus - это правда, а Focused - это ложь. Так есть ли OnGotFocus эквивалент для ContainsFocus? Или любым другим способом?

Ответы [ 3 ]

2 голосов
/ 06 декабря 2008

Примечание: события GotFocus дочерних элементов управления запускаются, если у вас есть дочерний элемент управления. В противном случае вызывается OnGotFocus формы.

Если я правильно понял вопрос, то это должно сработать:

    bool lastNotificationWasGotFocus = false;

    protected override void OnControlAdded(ControlEventArgs e)
    {
        SubscribeEvents(e.Control);
        base.OnControlAdded(e);
    }

    protected override void OnControlRemoved(ControlEventArgs e)
    {
        UnsubscribeEvents(e.Control);
        base.OnControlRemoved(e);
    }

    private void SubscribeEvents(Control control)
    {
        control.GotFocus += new EventHandler(control_GotFocus);
        control.LostFocus += new EventHandler(control_LostFocus);
        control.ControlAdded += new ControlEventHandler(control_ControlAdded);
        control.ControlRemoved += new ControlEventHandler(control_ControlRemoved);

        foreach (Control innerControl in control.Controls)
        {
            SubscribeEvents(innerControl);
        }
    }

    private void UnsubscribeEvents(Control control)
    {
        control.GotFocus -= new EventHandler(control_GotFocus);
        control.LostFocus -= new EventHandler(control_LostFocus);
        control.ControlAdded -= new ControlEventHandler(control_ControlAdded);
        control.ControlRemoved -= new ControlEventHandler(control_ControlRemoved);

        foreach (Control innerControl in control.Controls)
        {
            UnsubscribeEvents(innerControl);
        }
    }

    private void control_ControlAdded(object sender, ControlEventArgs e)
    {
        SubscribeEvents(e.Control);
    }

    private void control_ControlRemoved(object sender, ControlEventArgs e)
    {
        UnsubscribeEvents(e.Control);
    }

    protected override void OnGotFocus(EventArgs e)
    {
        CheckContainsFocus();
        base.OnGotFocus(e);
    }

    protected override void OnLostFocus(EventArgs e)
    {
        CheckLostFocus();
        base.OnLostFocus(e);
    }

    private void control_GotFocus(object sender, EventArgs e)
    {
        CheckContainsFocus();
    }

    private void control_LostFocus(object sender, EventArgs e)
    {
        CheckLostFocus();
    }

    private void CheckContainsFocus()
    {
        if (lastNotificationWasGotFocus == false)
        {
            lastNotificationWasGotFocus = true;
            OnContainsFocus();
        }
    }

    private void CheckLostFocus()
    {
        if (ContainsFocus == false)
        {
            lastNotificationWasGotFocus = false;
            OnLostFocus();
        }
    }

    private void OnContainsFocus()
    {
        Console.WriteLine("I have the power of focus!");
    }

    private void OnLostFocus()
    {
        Console.WriteLine("I lost my power...");
    }
0 голосов
/ 06 декабря 2008

Обработка событий GotFocus и LostFocus должна сделать это.

Еще одна вещь, которую стоит отметить ... SDK говорит это о свойстве ContainsFocus:

Вы можете использовать это свойство для определения будь то контроль или любой из элементы управления, содержащиеся в нем имеет фокус ввода. Чтобы определить, является ли контроль имеет фокус, независимо от имеет ли какой-либо из его дочерних элементов управления focus, используйте свойство Focused.

EDIT:

При обработке события GotFocus вам все равно может потребоваться проверить свойство Focused / ContainsFocus в зависимости от того, как настроена иерархия элементов управления.

ContainsFocus будет иметь значение true, если элемент управления или любой из его дочерних элементов имеют фокус. Фокусировка будет верна, только если конкретный элемент управления имеет фокус, независимо от его дочерних элементов.

0 голосов
/ 06 декабря 2008

Один из способов решить эту проблему - использовать таймер. Это определенно грубая сила, но она выполняет свою работу:

private Timer m_checkContainsFocusTimer = new Timer();
private bool m_containsFocus = true;

m_checkContainsFocusTimer.Interval = 1000; // every second is good enough
m_checkContainsFocusTimer.Tick += new EventHandler(CheckContainsFocusTimer_Tick);
m_checkContainsFocusTimer.Start();

private void CheckContainsFocusTimer_Tick(object sender, EventArgs e)
{
    if (!m_containsFocus && ContainsFocus)
        OnAppGotFocus();

    m_containsFocus = ContainsFocus;
}

Но есть ли более простой способ?

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