原谅这里相当差的代码。
我有一个图片框PictureBox
和一个Panel
部分。我正在尝试启动拖放操作,因此您单击并拖动图片框,并将其放入该部分创建一个副本。这可以。
但问题是,让我们说你点击图片框9次,没有拖动,只需点击。然后在第10回合,你做了一个正确的拖放操作....然后你得到10个重复项添加到该部分。
我猜我需要响应DragAndDrop无效时停止拖放操作以防止这些重复的构建,但我不知道在哪里实现这一点。
private void collectablePictureBox_MouseDown(object sender, MouseEventArgs e)
{
this.SelectedSection.AllowDrop = true;
this.SelectedSection.DragEnter += new DragEventHandler(this.CollectableSelectedSection_DragEnter);
this.SelectedSection.DragDrop += new DragEventHandler(this.CollectableSelectedSection_DragDrop);
this.collectablePictureBox.DoDragDrop(this.SelectedClassModel, DragDropEffects.Copy);
}
private void CollectablePictureBox_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{
Console.WriteLine(e.Action);
}
private void CollectableSelectedSection_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
}
private void CollectableSelectedSection_DragDrop(object sender, DragEventArgs e)
{
Point position = this.SelectedSection.PointToClient(new Point(e.X, e.Y));
position.X -= this.SelectedClassModel.Width >> 1;
position.Y -= this.SelectedClassModel.Height >> 1;
this.SelectedSection.AllowDrop = false;
this.SelectedSection.DragEnter -= this.CollectableSelectedSection_DragEnter;
this.SelectedSection.DragDrop -= this.CollectableSelectedSection_DragDrop;
this.SelectedSection.AddItem(this.SelectedClassModel, position, this.SectionCanvasSnapToGridCheckBox.Checked);
}
答案 0 :(得分:3)
你的问题来自这样一个事实:在每个MouseDown事件中你都会将处理程序添加到适当的事件中,所以当你实际执行拖放操作时,这些处理程序将被多次调用。目前我看到两种不同的解决方法:
解决问题的一种方法是不在MouseDown事件处理程序上启动Drag and Drop,但是 - 基于这篇MSDN文章 - 在MouseMove处理程序中启动它,如下所示:
private void collectablePictureBox_MouseMove(object sender, MouseEventArgs e)
{
if (sender != null && e.LeftButton == MouseButtonState.Pressed)
{
this.SelectedSection.AllowDrop = true;
this.SelectedSection.DragEnter += new DragEventHandler(this.CollectableSelectedSection_DragEnter);
this.SelectedSection.DragDrop += new DragEventHandler(this.CollectableSelectedSection_DragDrop);
this.collectablePictureBox.DoDragDrop(this.SelectedClassModel, DragDropEffects.Copy);
}
}
另一种方法是处理PictureBox的MouseUp事件,并执行与CollectableSelectedSection_DragDrop
处理程序类似的清理。