DoDragDrop停止/取消?

时间:2014-06-04 15:42:35

标签: c# winforms

原谅这里相当差的代码。

我有一个图片框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);

}

1 个答案:

答案 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处理程序类似的清理。