【问题标题】:Why DragLeave isn't triggered when drag drop effect is DragDropEffects.Link?为什么拖放效果为 DragDropEffects.Link 时不触发 DragLeave?
【发布时间】:2012-08-18 23:19:46
【问题描述】:

我正在尝试制作一个允许将文件拖放到ListView 的程序。我使用ListView.InsertionMark 来确定插入文件的位置。当我删除文件时,InsertionMark 不会消失,因为DragLeave 事件没有被触发;如果我将拖放效果更改为DragDropEffects.None,则释放鼠标时会触发DragLeave 事件。为什么会这样?

此外,文档说“如果键盘或鼠标按钮状态发生变化,则会引发 QueryContinueDrag 事件,并根据事件 QueryContinueDragEventArgsAction 属性的值。”但是QueryContinueDrag事件也没有触发。

public partial class MainForm : Form
{
    private ListView listView1 = new ListView();

    public MainForm()
    {
        InitializeComponent();

        this.Controls.Add(listView1);

        listView1.Dock = DockStyle.Fill;
        listView1.View = View.Details;
        listView1.Columns.Add("Test");
        listView1.Items.Add("0");
        listView1.AllowDrop = true;

        listView1.DragEnter += listView1_DragEnter;
        listView1.DragOver += listView1_DragOver;
        listView1.DragLeave += listView1_DragLeave;
        listView1.DragDrop += listView1_DragDrop;
        listView1.GiveFeedback += listView1_GiveFeedback;
        listView1.QueryContinueDrag += listView1_QueryContinueDrag;
    }

    private void listView1_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop))
        {
            e.Effect = DragDropEffects.Link | DragDropEffects.Scroll;
        }
        else
        {
            e.Effect = DragDropEffects.None;
        }
    }

    private void listView1_DragOver(object sender, DragEventArgs e)
    {
        // This is not done, only to show this problem.
        listView1.InsertionMark.Index = 0;
        listView1.InsertionMark.AppearsAfterItem = true;
    }

    private void listView1_DragLeave(object sender, EventArgs e)
    {
        listView1.InsertionMark.Index = -1;
    }

    private void listView1_DragDrop(object sender, DragEventArgs e)
    {
        // listView1.InsertionMark.Index = -1; // Is this really necessary?
    }

    private void listView1_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
    {
        this.Text = "listView1_QueryContinueDrag";
    }

    private void listView1_GiveFeedback(object sender, GiveFeedbackEventArgs e)
    {
        this.Text = "listView1_GiveFeedback";
    }
}

是否必须手动设置listView1.InsertionMark.Index = -1 才能隐藏InsertionMark?当拖放效果为DragDropEffects.Link时,是否有触发DragLeave事件?

【问题讨论】:

    标签: c# winforms listview drag-and-drop


    【解决方案1】:

    当我删除文件时,InsertionMark 不会消失,因为没有触发 DragLeave 事件;

    DragLeave:

    DragLeave 事件在用户将光标拖出控件或用户取消当前拖放操作时引发。

    (已添加重点)

    他们都没有 - 他们完成了下降。为什么你对这个事件当时没有触发如此惊讶?


    回复:QueryContinueDrag

    QueryContinueDrag 事件使拖放源能够确定是否应取消拖放操作。

    (已添加重点)

    我在这里可能是错的,但在这种情况下,您似乎是拖动目标,而不是源。

    【讨论】:

    • 但是如果我不设置e.Effect = DragDropEffects.Link | DragDropEffects.Scroll,当删除文件时,DragLeave事件确实会被触发。
    • @EFanZh - 如果您正在讨论将效果设置为 None 的代码分支,则不会发生删除操作。如果他们释放鼠标按钮,这实际上会强制取消操作。
    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2011-07-28
    • 2020-06-19
    • 2012-12-21
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    相关资源
    最近更新 更多