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);
}

DoDragDrop停止/取消

您的问题来自于这样一个事实,即在每个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处理程序类似的清理操作。