我有Form子类,包含MouseHover
和MouseLeave
的处理程序。当指针位于窗口的背景上时,事件可以正常工作,但当指针移动到控件里面窗口时,它会导致MouseLeave
事件。
无论如何都有一个覆盖整个窗口的活动。
(。NET 2.0,Visual Studio 2005,Windows XP。)
答案 0 :(得分:8)
只要鼠标进入子控件
,就覆盖MouseLeave事件不会触发 protected override void OnMouseLeave(EventArgs e)
{
if (this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition)))
return;
else
{
base.OnMouseLeave(e);
}
}
答案 1 :(得分:6)
没有好办法让MouseLeave对容器控件可靠。用计时器解决这个问题:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
timer1.Interval = 200;
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Enabled = true;
}
private bool mEntered;
void timer1_Tick(object sender, EventArgs e) {
Point pos = this.PointToClient(Cursor.Position);
bool entered = this.ClientRectangle.Contains(pos);
if (entered != mEntered) {
mEntered = entered;
if (!entered) {
// Do your leave stuff
//...
}
}
}
}
答案 2 :(得分:6)
当鼠标离开事件被触发时,一个选项是检查指针的当前位置并查看它是否在表单区域内。我不确定是否有更好的选择。
编辑:我们有一个类似的问题,您可能会感兴趣。 How to detect if the mouse is inside the whole form and child controls in C#?
答案 3 :(得分:0)
在您的用户控件上为您的控件创建一个mousehover事件,像这样(或其他事件类型)
private void picBoxThumb_MouseHover(object sender, EventArgs e)
{
// Call Parent OnMouseHover Event
OnMouseHover(EventArgs.Empty);
}
在托管UserControl的WinForm上,UserControl可以处理MouseOver,因此将其放在Designer.cs中
this.thumbImage1.MouseHover += new System.EventHandler(this.ThumbnailMouseHover);
在WinForm上调用此方法
private void ThumbnailMouseHover(object sender, EventArgs e)
{
ThumbImage thumb = (ThumbImage) sender;
}
ThumbImage是usercontrol的类型