我有一个Picturebox,用户可以向上或向下拖动。
有问题的节目是钢琴的复杂音乐人员编辑,因此实现工作人员笔记移动的唯一方法是通过一些if语句和修改坐标。
问题是用户无法向下移动PictureBox组件,但是当拖动对象时,没有任何反应。该类继承自PictureBox。
我只想强调PictureBox在向下拖动时有效,但在向上拖动时不会移动。拖动是间隔完成的,即PictureBox只能放置在某些位置(因此需要特定的坐标)。
答案 0 :(得分:1)
您当前的解决方案有时可能有效,但是当您尝试拖动控件并将其捕捉回您在if
语句中指定的坐标时,可以经常调用该事件。
建议的解决方案:
我建议您在包含要拖动控件的表单或父级中使用MouseMove
事件。值也应该是可配置的,而不是硬编码的。
代码只会稍微改变一下(比较当前鼠标坐标而不是控件的Left
和Top
属性),它应该可以正常工作。
<强>更新强>
我已经更正了您的代码,所以它现在可以让您将控件放在三个位置之一( y 等于 138 , 148 或 158 )。我只是稍微改变它不要求你改变很多代码,但我强烈建议你使用所描述的第一种方法:)。
int currentY;
bool isDragging = false;
private void OnDrag(object sender, MouseEventArgs e)
{
if (isDragging)
{
//calculate Y position relative to parent
int parentY = this.Top + e.Y;
if (parentY < currentY)
{
if (parentY > 158 && parentY >= 148)
{
if (this.Top != 148)
{
currentY += (this.Top - 148);
this.Top = 148;
}
}
else if (parentY < 148 /*&& parentY >= 138*/)
{
if (this.Top != 138)
{
currentY += (this.Top - 138);
this.Top = 138;
}
}
//And so on
}
else if (parentY > currentY)
{
if (/*parentY <= 158 &&*/ parentY >= 148)
{
currentY += (this.Top - 158);
this.Top = 158;
}
else if (parentY < 148 && parentY >= 138)
{
currentY += (this.Top - 148);
this.Top = 148;
}
//And so on
}
}
}
public void MusicNote_MouseDown(object sender, MouseEventArgs e)
{
currentY = this.Top + e.Y;
this.Capture = true;
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
isDragging = true;
}
this.MouseMove += new MouseEventHandler(OnDrag);
}
public void MusicNote_MouseUp(object sender, MouseEventArgs e)
{
isDragging = false;
this.Capture = false;
this.MouseMove -= new MouseEventHandler(OnDrag);
}
然而,之前的解决方案可能会更符合您的要求。