我正在努力做一些我认为应该很容易的事情(ish)。我有一个窗体和窗体底部的flowgridlayout面板。在此表单中,我使用X个用户控件动态填充它。控件都是相同的类型。
目标是当用户将鼠标悬停在用户控件上时,它会打开另一个表单并将其定位在鼠标所在的位置。当鼠标离开表格时,打开的表格消失。
这几乎很有效。问题是当用户控件中有标签或文本框之类的东西时。它被认为已离开UC,因此形式消失。
我的想法是使用X和Y来判断它是否在UC内部,但我无法弄明白。
我可以问:
1)最好的方法是什么? 2)我如何对其进行编码,因为UC是动态的,我无法准确知道它们的位置。
由于
修改
我试图找出鼠标指针,但没有到达那里。以下代码位于UC SmallTagBox_MouseLeave事件中:
Point loc = this.Location;
Point p = this.PointToScreen(this.Location);
Point p2 = this.PointToScreen(this.Parent.Location);
Point ms = MousePosition;
Rectangle screenBounds = new Rectangle(this.PointToScreen(this.Location), this.Size);
if (!screenBounds.Contains(ms))
{
thw.Close();
thw = null;
}
我不明白p2(它的父级)相对于屏幕的Y值是多少。
答案 0 :(得分:4)
挂钩所有控件MouseEnter和MouseLeave事件,然后弄清楚它是否仍在表单内部是非常痛苦的。一个简单的计时器也可以完成工作:
public partial class Form1 : Form {
private Timer mTimer;
public Form1() {
InitializeComponent();
mTimer = new Timer();
mTimer.Interval = 200;
mTimer.Tick += mTimer_Tick;
mTimer.Enabled = true;
}
private void mTimer_Tick(object sender, EventArgs e) {
if (!this.DesktopBounds.Contains(Cursor.Position)) this.Close();
}
}
答案 1 :(得分:0)
创意1)当MouseLeave
事件触发时,您可以检查鼠标坐标(相对于屏幕)并检查它们是否仍在您的用户控件的范围内。如果是,则应该假设鼠标必须通过控件返回到界外,并且这次可以安全地忽略该事件。
创意2)将MouseEnter
事件处理程序附加到子控件。然后,当鼠标进入一个时,您将知道并可以忽略usercontrol的MouseLeave
事件。然后当孩子的MouseLeave
事件触发时,再次检查用户控件的MouseEnter
。
答案 2 :(得分:0)
我想我会为你拥有的每个控件添加MouseLeave
的事件处理程序,并使用Parent
属性来查找你所使用的用户控件。我同意,但这会有点痛苦。
答案 3 :(得分:0)
您还可以遍历控件上的所有子控件(递归),并将MouseEnter和MouseLeave事件附加到它们。
如果鼠标在你的控制范围内,或者有一些儿童控制,你必须做一些簿记。