現在のソリューションは時々動作しますが、コントロールをドラッグしてif
ステートメントで指定した座標にスナップすると、イベントが頻繁に呼び出されることがあります。
提案された解決策は:
私はあなたがドラッグするコントロールを含むフォームまたは親でMouseMove
イベントを使用することをお勧めします。値はハードコードされていなくても設定可能でなければなりません。 コードは少ししか変わらないでしょう(コントロールのLeft
とTop
のプロパティの代わりに現在のマウス座標を比較しています)、正しく動作するはずです。
UPDATE:
それは今あなたが3ヶ所(Yのいずれかにコントロールを配置できるようにする、またはに等しく働くので、私は、あなたのコードを修正しました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);
}
以前のソリューションは、しかし、仕事はおそらくより多くのあなたはそれをしたいと。
(関連性がありません:「トップ」のチェック*が[番号の並び順](http://stackoverflow.com/a/3188857/71059)であれば読みやすくなります。同意しない) – AakashM
スニペットは診断には不十分です。典型的な問題は、コントロールを動かすとマウスの相対位置も変わるということです。 –
奇妙なことは、マウスを下に動かすと機能するということです。実際には完全に機能します。しかし、私はマウスを上に動かすと、それはdoesntです。そして、両方の状況でほぼ同じ正確なコードを使用しています。 –