DoDragDrop停止/取消
本文关键字:取消 停止 DoDragDrop | 更新日期: 2023-09-27 18:06:36
请原谅这里相当糟糕的代码。
我有一个图片框PictureBox
和一个section Panel
。我正在尝试开始一个拖放操作,所以你点击并拖动图片框,并将其放入Section中创建一个副本。这很好。
但问题是,假设你点击图片框9次,没有拖动,只是点击。然后在第10次转弯时,执行正确的拖放操作....然后你得到10个重复的添加到Section。
我猜我需要响应时,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);
}
您的问题来自于这样一个事实,即在每个MouseDown事件上您为适当的事件添加处理程序,因此当您实际执行拖放操作时,这些处理程序将被调用不止一次。目前我看到两种不同的方法来解决这个问题:
解决这个问题的一种方法是不要在MouseDown事件处理程序上启动拖放操作,而是——根据这篇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
处理程序类似的清理操作。