C# MouseLeave不';t从子控件移动到父控件时触发';父母

C# MouseLeave不';t从子控件移动到父控件时触发';父母,c#,winforms,user-controls,C#,Winforms,User Controls,我有一个UserControl,它监听自己的MouseLeave,以改变它的背景颜色和一些子对象的可见性。 如果孩子们看不见,也会听到他们自己的鼠标移动,以改变他们的背景颜色 一切正常的场景如下: 将鼠标移到用户控件中 将鼠标移到子对象中 将鼠标从子对象移动到用户控件中 问题在于: 将鼠标移到用户控件中 将鼠标移到子对象中 将鼠标移出子控件,而不是移到UserControl中,而是直接移到它的外部 由于子控件位于UserControl的最边缘,因此这种情况一直都会发生。 请注意,不仅UserCo

我有一个UserControl,它监听自己的MouseLeave,以改变它的背景颜色和一些子对象的可见性。 如果孩子们看不见,也会听到他们自己的鼠标移动,以改变他们的背景颜色

一切正常的场景如下:

  • 将鼠标移到用户控件中
  • 将鼠标移到子对象中
  • 将鼠标从子对象移动到用户控件中
  • 问题在于:

  • 将鼠标移到用户控件中
  • 将鼠标移到子对象中
  • 将鼠标移出子控件,而不是移到UserControl中,而是直接移到它的外部
  • 由于子控件位于UserControl的最边缘,因此这种情况一直都会发生。 请注意,不仅UserControl的MouseLeave不会启动,而且孩子的MouseLeave也不会启动

    为了确定鼠标是否已经离开了本例中的区域,我必须听取其他控件的MouseEnter,然后通知UserControl和Child,但我真的想避免使用这种解决方案,因为它很难看,也不是oopsish

    此外,子控件必须位于UserControl的最边缘,并且不能移动


    有人能想出解决这个问题的好办法吗?

    这不是MouseLeave应该做的。即使鼠标光标完全移动应用程序窗口,您也应该获得MouseLeave事件

    我猜您没有在MouseLeave处理程序中调用基方法


    无论如何,在MouseEnter上,你可以设置一个每0.25秒触发一次的计时器,并在其中检查鼠标是否仍在控件上方。如果不是,请关闭计时器并更改控件的颜色。

    我以前见过相同的行为。您的.NET版本是最新的吗?确保您使用的是最新的服务包


    你看过这个活动吗?我用它来捕捉鼠标信息并更智能地处理它们。这可能会在这里派上用场。

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

        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);
            }
        }
    

    你到底在用这个干什么。什么是基于什么事件而改变的。这将有助于找到合适的解决方案。这都是UI美学,没有什么可以通过其他方式在逻辑上完成的。是的,但没有明确说明当鼠标位于面板或其任何子面板内时,是否尝试触发一组逻辑,或者根据它离开哪个控件,应该发生不同的事情。另外,我不确定是否也有鼠标事件。我现在想象的是一只鼠标进入一个面板,对象消失,背景改变颜色。但是当它离开的时候,它会回来吗?哦,是的。在鼠标上,颜色变回原来的颜色,用户控件使其子对象再次可见。控件之间没有通信,除了UserControl在自己的MouseLeave上控制其子控件可见性的通信。我不需要调用base方法,因为我不重写它,我只听自己的事件。而且定时器解决方案显然不是我想要的。我知道如果MouseLeave事件不管发生什么都会被释放,我应该得到它,问题是我没有。你如何在不覆盖MouseLeave的情况下监听该事件?我只做
    this.MouseLeave+=…
    一切都是最新的。我已经看到了这个问题和答案,我更喜欢一个真正的解决方案,而不是一个古怪的黑客。对调试来说很有趣。谢谢UserControl和Child都不会触发MouseLeave事件,因此它可能不起作用,但我会试试。