我正在尝试从名为Locate32的程序中将文件拖到我的应用程序中(顺便说一句,这很棒)。以下是发生的事情:
e.Data.GetFormats()
{string[7]}
[0]: "FileDrop"
[1]: "FileNameW"
[2]: "FileName"
[3]: "FileNameMap"
[4]: "FileNameMapW"
[5]: "Shell IDList Array"
[6]: "Shell Object Offsets"
DataFormats.FileDrop
"FileDrop"
e.Data.GetDataPresent(DataFormats.FileDrop)
false
为什么e.Data.GetDataPresent(DataFormats.FileDrop)
会返回false
,即使FileDrop显然是列为“可用”的格式之一?
如果我e.Data.GetData(DataFormats.FileDrop)
,我会得到一堆文件名列表,就像我应该的那样。此外,从Windows资源管理器中拖放工作正常。
这是我的DragEnter处理程序的代码:
private void MyForm_DragEnter(object sender, DragEventArgs e) {
if(e.Data.GetDataPresent(DataFormats.FileDrop)) {
e.Effect = DragDropEffects.Copy;
} else {
e.Effect = DragDropEffects.None;
}
}
答案 0 :(得分:2)
如果DragDropEffects.Copy
在列表中,您应该查看e.AllowedEffect。
前段时间我在从GetDataPresent()
中获取正确的格式时遇到了一些问题。由于这个事实,我只是直接查看GetFormats()
提供的列表并自己做了。代码是这样的:
private void OnItemDragEnter(object sender, DragEventArgs e)
{
//Get the first format out of the list and try to cast it into the
//desired type.
var list = e.Data.GetData(e.Data.GetFormats()[0]) as IEnumerable<ListViewItem>;
if (list != null)
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.None;
}
}
这个简单的解决方案适用于我,但您也可以使用linq遍历GetFormats()
数组,并尝试通过IEnumerable<T>.OfType<MyType>()
或类似内容找到所需的类型。
答案 1 :(得分:0)
除非有人能告诉我为什么这是一个坏主意,否则我将采用以下方式:
private void MyForm_DragEnter(object sender, DragEventArgs e) {
e.Effect = (e.Data.GetFormats().Any(f => f == DataFormats.FileDrop)
? DragDropEffects.Copy
: DragDropEffects.None);
}
从Windows资源管理器和Locate32都可以使用。