在DragDrop方法中显示通知而不维护发件人的DoDragDrop

时间:2014-02-04 21:21:39

标签: c# .net winforms

MessageBox事件处理程序中显示DragDrop(错误)时 - 拖动操作尚未完成,因此当光标在桌面上时 - 它仍然具有拖动图标。我该如何预防?

要重现,只需将文件拖到包含以下内容的表单中:(+ AllowDrop = true

private void Form1_DragEnter(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.All;
}

private void Form1_DragDrop(object sender, DragEventArgs e)
{            
    e.Effect = DragDropEffects.None;//Doesn't help.
    MessageBox.Show(this, "Error");
}

1 个答案:

答案 0 :(得分:1)

你永远不应该阻止D + D事件,它会使阻力源变得粗糙并使其无法响应。没有恢复光标肯定是一个副作用。 事件完成后,您需要运行此类代码。使用Control.BeginInvoke()优雅地完成。像这样:

    protected override void OnDragDrop(DragEventArgs drgevent) {
        this.BeginInvoke(new Action(() => {
            MessageBox.Show(this, "Error");
        }));
        base.OnDragDrop(drgevent);
    }

请注意,一般来说,它应该永远不会这么远。拖放尝试应该由DragEnter事件处理程序排除。例如,如果需要,您可以使用StatusStrip显示温和诊断。