Случай, чтобы узнать, потерял ли Panel фокус в приложении Winforms? - PullRequest
1 голос
/ 03 августа 2011

У меня есть простая форма с 4-мя панелями.Каждая из этих панелей закреплена в родительском элементе, чтобы гарантировать, что в данный момент видна только одна панель.Теперь для Panel2, когда она движется спереди назад, я бы хотел поработать над этим событием.Я делаю панели видимыми, вызывая panel.BringToFront()
Я пробовал Leave событие, но это не работает.Для формы событие - Deactivate, что такое событие для Panel?

1 Ответ

1 голос
/ 03 августа 2011

Я думаю, LostFocus - это то, что вы ищете.

Редактировать

В качестве другой стратегии вы знаете, что вызов panel.BringToFront поставит в очередь обновление в вашем пользовательском интерфейсе.Куда бы вы ни звонили panel.BringToFront, возможно, вы могли бы просто вызвать один из ваших собственных методов или вызвать одно из ваших собственных событий.Таким образом, вы знаете , когда событие будет запущено, и точно что вызовет его.

Причина, по которой я подумал об этом, заключается в том, что я сомневаюсь в вашем Panel когда-нибудь будет иметь фокус непосредственно - скорее всего, один из его дочерних элементов управления будет иметь фокус.Сделав свой собственный триггер события, вам не нужно полагаться на что-то столь же изменчивое, как фокус.Кроме того, даже если у Panel есть фокус, всегда возможно, что он может потерять фокус другими способами, чем переключение вашей собственной панели.

Edit # 2

Вот попыткабыстрая реализация моих предыдущих разговоров.Я сделаю предположение, что этот код должен быть размещен где-то в том же классе, что и все ваши Panel экземпляры (т.е. в вашем Form классе).

// This will be the custom event to which you can subscribe
// in order to detect a switch in panels.
public event EventHandler PanelSwapEvent;

// This reference the currently visible panel - should be set
// to the default panel in the form's constructor, if possible.
private Panel currentPanel;

// This actually switches the panels, to minimize code duplication.
private void switchToPanel(Panel p)
{
    Panel lastPanel = currentPanel;
    currentPanel = p;

    // Move the panels, and invoke the event.

    p.BringToFront();
    if(PanelSwapEvent != null)
        PanelSwapEvent(lastPanel, new EventArgs());
}

// Here's the actual event handler (replaces your
// pnlServiceInfo_LostFocus handler).
private void PanelSwapHandler(object sender, EventArgs e)
{
    // whatever you want to do when panels are swapped
}

В этом примере sender обработчиком событий является панель, потерявшая «фокус».Использовать его так же просто, как сказать switchToPanel(pnl_whatever), чтобы указать, что вы хотите переключиться с текущей панели на панель с именем pnl_whatever.

...