我正在尝试制作一个允许将文件拖放到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
事件?
答案 0 :(得分:1)
当我删除文件时,
InsertionMark
不会消失,因为DragLeave
事件未被触发;
当用户将光标拖出控件或用户取消当前的拖放操作时,会引发
DragLeave
事件。< / p>
(强调补充)
他们没有 - 他们完成了下降。为什么你对这个事件没有开火感到惊讶呢?
QueryContinueDrag
事件使拖动源能够确定是否应取消拖放操作。
(强调补充)
我可能在这里错了,但在这种情况下,你似乎是拖拽目标,而不是来源。