Kri*_*ian 8 c# winforms mousedown
我在form_MouseDown事件上有一个Drag()方法.我在表单上也有一个点击事件.问题是,如果我单击表单,MouseDown事件将被触发,它永远不会有机会触发click事件.
解决这个问题的最佳方法是什么?如果表单实际被拖动,我在考虑计算像素,但必须有更好的方法.有什么建议?
我正在考虑如果表单实际上被拖动则计算像素,但必须有更好的方法。
不,这正是你必须要做的。
这不仅仅是软件限制;它也非常实用。如果您从用户的角度思考问题,您将立即看到问题以及解决方案。问问自己,单击和拖动有什么区别?
两者都以鼠标按钮在对象上向下移动开始,但其中一个以鼠标按钮返回到对象上方的相同位置结束,而另一种以鼠标按钮返回到完全不同的位置结束。
由于时间机器尚未完善,您无法提前知道这一点。
所以,是的,您需要保持某种距离阈值,如果指针在对象上方时移动到该距离阈值之外,则您将其视为拖动。否则,您认为这是一次点击。
该距离阈值不应为 0。不应要求用户完全保持鼠标静止才能启动单击。许多用户都是低于标准的鼠标使用者。当尝试点击时,它们很可能会轻微抽搐。如果阈值为 0,当他们尝试单击时,他们最终会进行大量无意的拖动。
当然,您实际上不必担心这些或自己计算阻力阈值。相反,请使用 Windows 默认值,可通过调用该GetSystemMetrics
函数并指定SM_CXDRAG
或 来获取SM_CYDRAG
。(这些可能会被 WinForms 框架暴露在某个地方,但我不这么认为。自己 P/Invoke 它们也很容易。)
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));
}
Run Code Online (Sandbox Code Playgroud)
在 UX/UI 领域,这种现象称为磁滞或去抖动,类似于物理和电子学中这些术语的使用。
小智 5
我找到了这个解决方案,尽管它适用于双击和鼠标按下事件:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
来源:http://code.rawlinson.us/2007/04/c-dragdrop-and-doubleclick.html