【问题标题】:Event to know if Panel lost focus in Winforms application?知道面板是否在 Winforms 应用程序中失去焦点的事件?
【发布时间】:2011-08-03 00:22:08
【问题描述】:

我有一个简单的表格,里面有 4 个面板。这些面板中的每一个都停靠在父面板中,以确保在给定时间只有一个面板可见。现在,对于 Panel2,当它从前向后移动时,我想处理该事件。我通过调用panel.BringToFront()使面板可见
我已经尝试过Leave 事件,但这不起作用。 Form 的事件是Deactivate,Panel 的事件是什么?

【问题讨论】:

标签: winforms focus panel


【解决方案1】:

我认为LostFocus 就是您要找的东西。

编辑

作为另一种策略,您知道调用 panel.BringToFront 将在您的 UI 中排队更新。无论您在哪里调用panel.BringToFront,也许您都可以调用您自己的方法之一,或者触发您自己的事件之一。这样,您知道什么时候触发事件,以及确切地什么会触发它。

我想到这一点的原因是,我怀疑您的 Panel 是否会真正拥有焦点 - 相反,它的子控件之一可能会拥有焦点。通过做你自己的事件触发器,你不必依赖像焦点这样不稳定的东西。另外,即使Panel 确实有焦点,它也总是有可能以其他方式失去焦点,而不是您自己的面板切换。

编辑#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 的面板。

【讨论】:

  • 是的,请参阅 MSDN 上的 Panel Events。我相信它不会出现在VS属性框中,因为它有[BrowsableAttribute(false)]
  • 很高兴知道这一点。但它仍然不起作用。这是我的代码。private void pnlServiceInfo_LostFocus(object sender, System.EventArgs e) { MessageBox.Show("Hi!"); } 也注册了活动。this.pnlServiceInfo.LostFocus += new System.EventHandler(this.pnlServiceInfo_LostFocus);
  • 查看我的编辑 - 我认为这可以更准确地解释问题,并且可以实际解决您的问题。
  • 我也担心面板的焦点,因为它的子控件之一会获得焦点。虽然在每个 bringToFront() 中加入正是我想要的,但这是一项相当乏味的工作。因为我实际上有 14 个面板。这可能会随着时间的推移而增加!我想将代码放在 1 处。还有其他想法吗?
  • 我看看能不能举个例子。
猜你喜欢
  • 1970-01-01
  • 2013-07-08
  • 2010-09-07
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多