0

我有一个 UserControl 监听它自己的 MouseLeave 以改变它的背景颜色和它的一些孩子的可见性。应该失去可见性的孩子也听他们自己的 MouseLeave 以改变他们的背景颜色。

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

  1. 将鼠标移动到 UserControl。
  2. 将鼠标移至子级。
  3. 将鼠标移出 Child 进入 UserControl。

有问题的情况是这样的:

  1. 将鼠标移动到 UserControl。
  2. 将鼠标移至子级。
  3. 将鼠标移出 Child,而不是移入 UserControl,而是直接移出。

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

在这种情况下,为了查明鼠标是否真的离开了该区域,我必须听其他控件的 MouseEnter,然后通知 UserControl 和 Child,但我真的想避免这种解决方案,因为它很丑陋而不是 OOPish .

此外,Child 必须位于 UserControl 的最边缘,并且不能移动。

谁能想到一个巧妙的解决方案?

4

3 回答 3

6

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

    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);
        }
    }
于 2012-10-26T22:31:57.513 回答
1

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

你见过Application.AddMessageFilter事件吗?我在这里的答案中使用它来捕获鼠标消息并更智能地处理它们。它可能在这里派上用场。

于 2012-10-26T22:18:06.927 回答
0

这不是 MouseLeave 应该表现的方式。即使鼠标光标完全移动了您的应用程序窗口,您也应该得到 MouseLeave 事件。

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

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

于 2012-10-26T21:51:13.440 回答