日期:2014-05-18  浏览次数:20979 次

MouseLeave事件有时候触发不了
程序的界面上面有许多个Label控件,给所有这些Label注册了MouseMove和MouseLeave事件
实现的效果是,当鼠标经过或停留在Label控件上时,显示Label的边框,当鼠标指针离开Label隐藏边框。
就是只有当鼠标经过Label时,才让用户看到Label控件(控件的背景设置得和父窗体的毕竟颜色一致,这样不显示边框时就好像隐藏起来一样)
同时还注册了Label的TextChanged事件,当有内容时显示Label边框(没内容的时候我都会把Text属性设置为6个空格)

很简单的效果,效果是实现了,但是在实际运行中,有时候MouseLeave事件有时候会没有触发,就是鼠标离开了Label,但是边框仍然存在。这种情况特别在鼠标移动快,在各个Label之间快速移动的时候出现的较多。只有再把鼠标指针再一次移到Label上,再移开,边框才消失。

请问大家这是什么原因?

以下是相关代码

private void windowText_Changed(object sender, EventArgs e)
  {
  Label window = (Label)sender;
  if (window.Text == " ")
  window.BorderStyle = BorderStyle.None;
  else
  window.BorderStyle = BorderStyle.Fixed3D;

  }

  private void mouseOverWindow(object sender, MouseEventArgs e)
  {
  Label window = (Label)sender;
  window.BorderStyle = BorderStyle.Fixed3D;
  }

  private void mouseLeaveWindow(object sender, EventArgs e)
  {
  Label window = (Label)sender;
  if (window.Text == " ")
  window.BorderStyle = BorderStyle.None;
  }

------解决方案--------------------
就像你说的,是因为移动的太快了!

还有,像这种情况你最好扩展一下Label这个控件,不要在窗体上注册事件,因为如果有很多的Label会很麻烦!不过这样效果也不会有太大改善!如果你想让效果更好的话还得多花些心思!

比如,你可以在一个Label的MouseEnter事件中强行取消其他Label的边框!