当拖拽效果为DragDropEffects.Link时,为什么不触发DragLeave?

时间:2012-08-23 12:32:04

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

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

此外,该文档说“如果键盘或鼠标按钮状态发生变化,则会引发QueryContinueDrag事件并确定是继续拖动,删除数据还是取消基于操作的操作关于事件Action的{​​{1}}属性的值。“但QueryContinueDragEventArgs事件也未被触发。

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时,是否仍然会触发DragLeave事件?

1 个答案:

答案 0 :(得分:1)

  

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

DragLeave

  

当用户将光标拖出控件或用户取消当前的拖放操作时,会引发DragLeave事件。< / p>

(强调补充)

他们没有 - 他们完成了下降。为什么你对这个事件没有开火感到惊讶呢?


回复:QueryContinueDrag

  

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

(强调补充)

我可能在这里错了,但在这种情况下,你似乎是拖拽目标,而不是来源。