我在form_MouseDown事件上有一个Drag()方法。我在窗体上也有一个单击事件。问题是,如果我点击表单,MouseDown事件就会被触发,而它永远没有机会触发点击事件。
解决这个问题的最好方法是什么?我在想,如果窗体真的被拖动了,就计算像素,但肯定有更好的方法。有什么建议吗?
发布于 2013-03-10 20:57:56
我在想,如果窗体真的被拖动了,我就会计算像素,但肯定有更好的方法。
不,这正是你必须要做的。
这不仅仅是一个软件限制;它也是一个非常实用的限制。如果你从用户的角度思考问题,你会立即看到问题和解决方案。问问你自己,点击和拖动有什么不同?
它们都是从鼠标按键在对象上向下移动开始的,但其中一个结束时鼠标按键在同一位置上返回到对象上,另一个结束时鼠标按键在完全不同的位置上返回。
由于时间机器还没有完善,你没有办法提前知道这一点。
所以,是的,你需要保持某种距离阈值,如果指针在物体上方时移动到距离阈值之外,那么你就认为这是一种拖动。否则,你会认为这是一次点击。
该距离阈值不应为0。不应该要求用户为了启动点击而完全保持鼠标不动。许多用户都是不合格的鼠标用户。当尝试点击时,它们很可能会轻微抽动。如果阈值为0,则在尝试单击时,它们将无意间进行大量拖动。
当然,您实际上不必担心这些,也不必自己计算阻力阈值。而是使用Windows默认值,可以通过调用GetSystemMetrics函数并指定SM_CXDRAG或SM_CYDRAG来获得。( WinForms框架可能会在某个地方公开这些内容,但我不这么认为。自己P/调用它们也很容易。)
const int SM_CXDRAG = 68;
const int SM_CYDRAG = 69;
[DllImport("user32.dll")]
static extern int GetSystemMetrics(int index);
Point GetDragThreshold()
{
return new Point(GetSystemMetrics(SM_CXDRAG), GetSystemMetrics(SM_CYDRAG));
}在UX/UI领域,这类东西被称为滞后或去抖动,类比于这些术语在物理学和电子学中的使用。
发布于 2015-09-07 11:02:25
我找到了这个解决方案,尽管它是针对双击和鼠标按下事件的:
void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && e.Clicks ==1)
{
PictureBox pb = (PictureBox)sender;
DoDragDrop((ImageData)pb.Tag, DragDropEffects.Copy);
}
}来源:http://code.rawlinson.us/2007/04/c-dragdrop-and-doubleclick.html
发布于 2013-03-10 20:51:31
不幸的是,在“按钮被按下”的时候,您还不知道所需的操作是单击还是拖放。您将在稍后的中找到它。
对于一次点击,决定因素是“没有移动”和“按钮向上”。
对于拖拽,决定因素是“移动”和“向上按钮”。
因此,要消除这些交互的歧义,不仅要跟踪按钮,还要跟踪移动。您不需要跟踪整个移动,只需按下按钮和向上按钮之间的移动是有趣的。
因此,这些事件是启动/停止Mouse.Capture机制的好地方(动态显示拖动装饰器和drop location提示),或者,在更简单的形式中-存储移动矢量的原点和目标并检查距离是否>D(即使发生了移动,也应该有一些安全的最小距离来取消拖动。鼠标有时会“参差不齐”,人们真的不希望你的应用程序在快速鼠标指针移动结束时双击时开始拖动:)
https://stackoverflow.com/questions/15322342
复制相似问题