有关Panel是否在Winforms应用程序中失去焦点的事件?

时间:2011-08-03 00:22:08

标签: winforms focus panel

我有一个简单的表格,里面有4个面板。这些面板中的每一个都停靠在父级中,以确保在给定时间只能看到一个。现在,对于Panel2,当它从前向后移动时,我想参与该事件。我通过致电panel.BringToFront()来制作面板 我尝试了Leave事件,但这不起作用。对于表单,事件为Deactivate,Panel的事件是什么?

1 个答案:

答案 0 :(得分:1)

我在想LostFocus正是你要找的。

修改

作为另一种策略,您知道调用panel.BringToFront会在您的UI中排队更新。无论您在哪里呼叫panel.BringToFront,也许您可​​以调用自己的方法,或触发自己的事件。通过这种方式,您可以在触发事件时知道,并且 将触发它。

我之所以想到这一点,是因为我怀疑你的Panel实际上是否会真正关注焦点 - 相反,它的一个子控件很可能会成为焦点。通过自己设置事件触发器,您不必依赖像焦点一样易变的东西。另外,即使Panel确实有焦点,它总是可能会失去焦点,而不是你自己的面板切换。

编辑#2

这是尝试快速实现我以前的ramblings。我将假设此代码与所有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的面板一样简单。