在Windows窗体中拖动阈值感知拖动

时间:2012-08-08 12:41:46

标签: .net winforms drag-and-drop

从列表和树视图中拖动具有很好的属性,即在将鼠标移动到最小距离(拖动阈值)之前,它不会开始拖动。拖动阈值由.NET窗体中通过SystemInformation.DragSize提供的SM_CXDRAG和SM_CYDRAG系统指标控制。

如果我想实现一个尊重阻力阈值的自定义拖动,那么最好的方法是什么呢? MSDN上的文档似乎完全避免了这个问题,只是告诉你立即在MouseDown上调用DoDragDrop。

是否有一些我错过的事件可用于检测鼠标拖动的距离是否超过阻力阈值?我真的应该自己实现这么常见吗?

2 个答案:

答案 0 :(得分:1)

好吧,TreeView和ListView都有ItemDrag事件来告诉你它。但这不是Control类的标准事件,事件是特定于类的,并由底层本机Windows控件生成的专用通知触发。分别是TVN_BEGINDRAG和LVN_BEGINDRAG。一些其他常见的控件有它,标题,工具栏和钢筋。消息和控件都不是“标准”,它们在Windows 95时间框架之后被添加到Windows中。 Microsoft没有将其功能添加到旧控件中。

这就是降压停止的地方。您需要在任何其他Control类上实现自己的。使用MouseDown和MouseMove事件并不困难。

答案 1 :(得分:-1)

实现阻力阈值相当容易。在鼠标按下时,保存光标的位置并调用DoDragDrop,然后在拖动事件中,检查鼠标当前位置与保存位置之间的距离,并仅在距离大于阈值时移动元素。