我的UserControl
是一种容器,里面有一组控件。我设计的一个UI行为是,嵌套控件的移动使其被选中用于某些键盘触发的操作。
设置目标接收键盘输入的嵌套控件的另一种方法是使用箭头键将焦点更改为UserControl
中的某个控件。
问题在于,在大多数情况下,我的UserControl
具有滚动条,并且使用箭头键在其元素之间切换会导致内容移动。由于这种运动,当鼠标箭头静止不动时,似乎也会启动mousemove事件,但它在我的用户控制之上。最后,正在选择错误的嵌套控件。
我尝试设置一个布尔标志,以便在启动箭头键处理功能时临时锁定mousemove事件的操作,但似乎根本不起作用。
有没有人知道如何防止意外触发mousemove事件并避免它引起的问题?
答案 0 :(得分:0)
我做了一些调试/实验,看起来尽管鼠标仍然在控制之上,但 MouseMove 实际上经常被调用,而不仅仅是当控件移动是由某些UI行为引起的时候(调用父控件的滚动)使用键盘)。
它似乎也是每秒调用两次(但可能只有在调试会话期间从VS启动应用程序?)时,调用会被几百秒的间隔分开,而现在我无法确定是什么原因造成的。
解决方案(可能不仅仅是,而不是最好的)是存储光标的最后位置并在事件内部进行比较,以检查鼠标是否真的从上一次 MouseMove 调用移动。我使用System.Windows.Forms.Cursor.Position
实现了它,因为来自 MouseEventArgs 的位置会因环境而异,但仍然无法确定是否移动了鼠标光标。
Point lastCursorPosition = new Point();
private void panelPictures_MouseMove(object sender, MouseEventArgs e)
{
if (System.Windows.Forms.Cursor.Position != lastCursorPosition)
{
Console.WriteLine("mouse moved");
lastCursorPosition = System.Windows.Forms.Cursor.Position;
}
else
{
Console.WriteLine("mouse in place");
}
}