【问题标题】:Unusual dragging issue in C# WinFormC# WinForm 中不寻常的拖动问题
【发布时间】:2012-01-25 15:28:33
【问题描述】:

我有一个用户可以拖动的 PictureBox。拖动完成后,组件似乎会不断地左右移动,就像振动一样。

【问题讨论】:

  • 释放了鼠标按钮,控件还是移动了?然后我建议记录MouseDownMouseUpOnDrag,后者的值为isDragging,例如进入一个列表视图。很高兴知道为什么isDragging 不会变成false
  • 我不确定我明白你在说什么 Yogu。你认为问题可能是什么?>
  • Unusual dragging issue 的可能重复项
  • 问题是尽管不再按下鼠标按钮,但控件仍会移动,对吗?那么,isDragging 必须为真;否则,它不会移动。因此,问题是,为什么isDragging 为真,尽管MusicNote_MouseUp 之前肯定已经将其设置为false。要回答这个问题,我们必须找出调用方法的顺序。例如,一个原因可能是 MusicNote_MouseUp 没有被调用。或者之后调用MusicNote_MouseDown。老实说,我真的不知道这是怎么发生的。
  • 这不是一个重复的问题,请正确阅读。这是相同的代码,但不同的问题。在另一个问题中,笔记根本不会移动。现在它会移动但会抖动。

标签: c# .net winforms drag-and-drop picturebox


【解决方案1】:

您的代码不是很合乎逻辑。它说:如果用户将笔记向下拖动一个像素,则将笔记设置为向下一级。如果鼠标随后向侧面移动,则鼠标每移动一个像素,音符就会向下移动一步。

我建议回到概念。

  • 首先,必须确定鼠标距离:delta = e.Y - currentY
  • 然后,将其捕捉到网格中:gridDelta = delta / step * step,其中step 在您的情况下为 10。

    delta / step 表示音符移动的音调数。因为我们使用的是整数,所以这个值是四舍五入的,我们只有全音。如果鼠标向上移动 10(= 步)像素,则选择下一个较高的色调。

    delta / step * step 是必需的,因为从一种音调到另一种音调的距离为 10,即如果将音符移动高一音,则该音符应出现在其原始位置上方 10 像素处。

  • 接下来,将gridDelta 添加到this.Top 并检查结果是否在范围内。
  • 最后,将值保存到this.Top

也许数字更清楚:如果用户在位置 Y=14 处按下鼠标按钮,然后将其拖动到 48,然后释放,则在最后一次调用 OnDrag 时会发生以下情况:

  • delta = 48 - 14 - delta 是 34。
  • gridDelta = 34 / 10 * 10 - 34/10 = 3; 3 * 10 * 30 - 所以gridDelta 是 30。
  • newTop = this.Top + 30
  • 检查newTop是否在范围内,然后赋值给this.Top

您会看到,尽管用户将它拖了 34 像素,但该注释正好在其原始位置上方 30 像素。

像代码中的重复这样的重复通常会导致错误,并且很难调整它们,因此请始终寻找更好的算法。

【讨论】:

  • 非常感谢 - 您的建议不是“if 语句”,还是可以与它们集成?再次感谢您的帮助。
  • 我提出的概念取代了您的if 声明。你对每个音调都有一个if 声明;我的代码处理所有可能的音调。
  • 非常感谢Yogu,我试试看!
猜你喜欢
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多