当鼠标离开控件时Winforms事件

时间:2013-10-31 08:33:10

标签: c# winforms events user-controls

我有一个覆盖在其他控件上的用户控件。一个按钮显示它,我希望它在鼠标离开时隐藏(Visible = false)。我应该使用什么事件?我尝试了Leave,但只有在我手动隐藏它之后才会触发。我也考虑过MouseLeave,但这种情况从未被解雇过。

编辑:控件由ListViewPanel组成,其中包含一串按钮。它们直接停靠在控件中,没有顶级容器。

1 个答案:

答案 0 :(得分:0)

UserControl实际上是一个面板,为了方便和易于重复使用而对其进行一些控制(它具有设计时支持的优势)。实际上,当您将鼠标移出UserControl时,其中一个子控件会触发MouseLeave,而不是UserControl本身。我认为你必须为你的Application-wide MouseLeave实现一些UserControl

public partial class YourUserControl : UserControl, IMessageFilter {
  public YourUserControl(){
    InitializeComponent();
    Application.AddMessageFilter(this);
  }
  bool entered;
  public bool PreFilterMessage(ref Message m) {
    if (m.Msg == 0x2a3 && entered) return true;//discard the default MouseLeave inside         
    if (m.Msg == 0x200) {                
      Control c = Control.FromHandle(m.HWnd);
      if (Contains(c) || c == this) {                    
         if (!entered) {
            OnMouseEnter(EventArgs.Empty);
            entered = true;                  
          }                   
      } else if (entered) {
         OnMouseLeave(EventArgs.Empty);
         entered = false;                    
      }
    }
    return false;
  }
}