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