【问题标题】:MouseLeave not fired C# WinFormsMouseLeave 未触发 C# WinForms
【发布时间】:2013-03-05 17:26:35
【问题描述】:

我有一个带有 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 事件不会被触发,并且按钮保持可见,即使鼠标在控件之外。

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

【问题讨论】:

  • 你能设置一个断点来验证事件确实没有触发吗?还是您基于观察到的行为?
  • 观察到的行为表明,我正在做一些调试(打印到控制台)来确认这种情况。
  • 我已经测试了你的代码有和没有 OnMouseLeave 并且在这两种情况下它都工作得很好。为什么要在重写的 OnMouseLeave 方法中进行额外检查?这里没有必要。
  • @virious 在大多数情况下都可以正常工作。但是我有几个控制这些事件的控件,有时当我将鼠标移到它们上时,MouseLeaveevent 不会被触发。因此,它恰好存在几个按钮可见的控件,而鼠标不在它们之上。

标签: c# winforms events mouseleave


【解决方案1】:

正如this 链接状态:

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

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

不是最优雅的解决方案,但可以按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2019-07-14
    • 2015-09-18
    • 2010-11-14
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多