MouseLeave not fired C# WinForms

本文关键字:WinForms fired not MouseLeave | 更新日期: 2023-09-27 18:02:15

我有一个带有2个按钮的用户控件,只有当鼠标在控件区域内时才能看到。

我像这样展示按钮:

private void Node_MouseEnter(object sender, EventArgs e)
{           
    btn1.Show();
    btn2.Show();
}

并像这样隐藏:

protected override void OnMouseLeave(EventArgs e)
{
    if (this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition)))
        return;
    else base.OnMouseLeave(e);
}
private void Node_MouseLeave(object sender, EventArgs e)
{  
    btn1.Hide();
    btn2.Hide();
}

问题是有时(随机情况)MouseLeave事件没有被触发,并且按钮保持可见,即使鼠标在控件之外。

多个事件是否可能发生冲突?

MouseLeave not fired C# WinForms

如下链接所示:

鼠标移动消息不够准确,它们不能保证报告每个遍历的像素。当子窗口靠近父窗口的边缘时,当您移动鼠标足够快时,很容易无法获得父窗口的MouseEnter。

所以,解决方案是只监听MouseEnter事件,当这个事件被触发时,我发送一个通知给其他控件,隐藏它的按钮。

不是最优雅的解决方案,但它的工作方式与预期一致。