我有一个简单的表格,里面有4个面板。这些面板中的每一个都停靠在父级中,以确保在给定时间只能看到一个。现在,对于Panel2,当它从前向后移动时,我想参与该事件。我通过致电panel.BringToFront()
来制作面板
我尝试了Leave
事件,但这不起作用。对于表单,事件为Deactivate
,Panel的事件是什么?
答案 0 :(得分:1)
我在想LostFocus
正是你要找的。 p>
作为另一种策略,您知道调用panel.BringToFront
会在您的UI中排队更新。无论您在哪里呼叫panel.BringToFront
,也许您可以调用自己的方法,或触发自己的事件。通过这种方式,您可以在触发事件时知道,并且 将触发它。
我之所以想到这一点,是因为我怀疑你的Panel
实际上是否会真正关注焦点 - 相反,它的一个子控件很可能会成为焦点。通过自己设置事件触发器,您不必依赖像焦点一样易变的东西。另外,即使Panel
确实有焦点,它总是可能会失去焦点,而不是你自己的面板切换。
这是尝试快速实现我以前的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
的面板一样简单。