2012-08-23 41 views
0

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

此外,文档中还提到“如果键盘或鼠标按钮状态有变化,则会引发QueryContinueDrag事件并确定是继续拖动,删除数据还是取消基于该值的操作的Action财产的事件的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事件时,拖放效果是DragDropEffects.Link

回答

1

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

DragLeave

当用户拖动光标移出所述控制的或者用户取消当前拖动和放下操作DragLeave事件引发。

(强调)

他们既没有 - 他们完成了下降。你为什么如此惊讶,以至于这个事件并没有发生呢?


重新:QueryContinueDrag

QueryContinueDrag事件使得拖动源确定拖动和放下操作是否应被取消。

(强调)

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

+0

但是,如果我不设置'e.Effect = DragDropEffects.Link | DragDropEffects.Scroll',当删除文件时,'DragLeave'事件被触发。 – EFanZh

+1

@EFanZh - 如果你正在谈论代码的分支,你可以将效果设置为None,那么就不会发生拖放操作。如果释放鼠标按钮,这将有效地强制取消该操作。 –