在winform中,想要将外部文件拖入软件窗体内,只需在控件里实现三个方法,并设置该控件的AllowDrop属性值为true即可
string filepath;//拖入文件的路径
bool hasDropedData;//用于判断是否已拖入
private void groupBox1_DragDrop(object sender, DragEventArgs e)
{
string[] FileArray = (string[])e.Data.GetData(DataFormats.FileDrop);//获取拖入的文件(夹)名
filepath= FileArray[0];//保存拖入文件路径
}
private void groupBox1_DragEnter(object sender, DragEventArgs e)
{
string[] FileArray = { };
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.All;//更改鼠标显示
FileArray = (string[])e.Data.GetData(DataFormats.FileDrop);//获取拖入的文件(夹)名
}
else
{
e.Effect = DragDropEffects.None;
}
label1.Text = FileArray[0];//在label里显示拖入的文件绝对路径
}
private void groupBox1_DragLeave(object sender, EventArgs e)
{
if (hasDropedData)
{
label11.Text = formexcel;
return;
}
label1.Text = string.Empty;
}
但在WPF里,向容器控件(如Grid,GroupBox等)中添加上述事件后,将文件拖入控件内,会发现空白处会显示禁止拖放的鼠标光标,只有拖入到子控件上方,才会显示正在拖入的鼠标光标。(TextBox除外,因为WPF的TextBox对拖放事件处理机制的不同)
解决方案很简单:为该容器控件添加一个背景即可。
在下面的代码里,我添加了一个透明背景Background="Transparent"
<Grid AllowDrop="True" Background="Transparent" DragOver="Grid1_DragOver" DragDrop="Grid1_DragDrop" DragLeave="Grid1_DragLeave">
现在再尝试将文件拖入Grid,会发现程序将正常显示正在拖入的鼠标光标。