从子控件移动到父级父级时,MouseLeave不会触发

Sim*_*Var 0 c# user-controls winforms

我有一个UserControl,它可以监听它自己的MouseLeave,以便改变它的背景颜色和一些儿童的可见性.应该失去知名度的孩子,也要听自己的MouseLeave以改变他们的背景颜色.

一切正常的场景是这样的:

  1. 将鼠标移动到UserControl.
  2. 将鼠标移动到Child.
  3. 将鼠标移出Child进入UserControl.

有问题的情况是这样的:

  1. 将鼠标移动到UserControl.
  2. 将鼠标移动到Child.
  3. 将鼠标移出Child,而不是移入UserControl,但直接移到UserControl之外.

这种情况一直发生,因为Child位于UserControl的最边缘.请注意,不仅UserControl的MouseLeave不会触发,而且Child的MouseLeave也不会触发.

为了确定在这种情况下鼠标是否实际上已离开该区域,我必须听其他控件的MouseEnter,然后通知UserControl和Child,但我真的想避免这个解决方案,因为它很难看而不是OOPish .

此外,Child必须位于UserControl的最边缘,并且无法移动.

谁能想到这个问题的巧妙解决方案?

cor*_*ulu 5

我的测试显示这是一个有效的解决方案.只需要一个自定义用户控件.

    public class MyPanel : Panel
    {
        protected override void OnControlAdded(ControlEventArgs e)
        {
            e.Control.MouseLeave += DidMouseReallyLeave; 
            base.OnControlAdded(e);
        }
        protected override void OnMouseLeave(EventArgs e)
        {
            DidMouseReallyLeave(this, e);
        }
        private void DidMouseReallyLeave(object sender, EventArgs e)
        {
            if (this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition)))
                return;
            base.OnMouseLeave(e);
        }
    }
Run Code Online (Sandbox Code Playgroud)