gpt4 book ai didi

c# - MouseDown 和 Click 冲突

转载 作者:太空狗 更新时间:2023-10-29 18:35:50 28 4
gpt4 key购买 nike

我在 form_MouseDown 事件上有一个 Drag() 方法。我在表单上也有一个点击事件。问题是,如果我单击表单,则会触发 MouseDown 事件,并且它永远不会有机会触发单击事件。

解决这个问题的最佳方法是什么?如果表单确实被拖动,我正在考虑计算像素,但必须有更好的方法。有什么建议么?

最佳答案

I was thinking counting pixels if the form is actually dragged, but there has to be a better way.

不,这正是您必须要做的。

这不仅仅是软件限制;这也是非常实用的。如果您从用户的角度思考问题,您会立即看到问题所在以及解决方案。问问自己,点击和拖动有什么区别?

它们都以鼠标按钮在对象上向下移动开始,但其中一个以鼠标按钮回到同一位置的对象上方结束,另一个结束于鼠标按钮以一个方式返回完全不同的立场。

由于时间机器尚未完善,您无法提前知道这一点。

所以,是的,您需要保持某种距离阈值,如果指针在物体下方移动到该距离阈值之外,则您认为这是一种拖拽。否则,您会将其视为一次点击。

该距离阈值不应为 0。不应要求用户完全静止以启动点击。许多用户都是低于标准的鼠标用户。他们很可能在尝试点击时轻微抽搐。如果阈值为 0,他们最终会在尝试点击时无意中进行大量拖动。

当然,您实际上不必担心这些,也不必自己计算阻力阈值。相反,使用 Windows 默认值,可通过调用 GetSystemMetrics 函数并指定 SM_CXDRAGSM_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));
}

在 UX/UI 领域,这种事情被称为滞后去抖动,类比这些术语在物理学和电子学中的使用。 p>

关于c# - MouseDown 和 Click 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15322342/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com