我已经在Borland的Turbo C ++环境中看到了这一点,但是我不确定如何针对正在开发的C#应用程序进行此操作。是否有最佳实践或陷阱?
我已经在Borland的Turbo C ++环境中看到了这一点,但是我不确定如何针对正在开发的C#应用程序进行此操作。是否有最佳实践或陷阱?
Answers:
一些示例代码:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
this.AllowDrop = true;
this.DragEnter += new DragEventHandler(Form1_DragEnter);
this.DragDrop += new DragEventHandler(Form1_DragDrop);
}
void Form1_DragEnter(object sender, DragEventArgs e) {
if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;
}
void Form1_DragDrop(object sender, DragEventArgs e) {
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (string file in files) Console.WriteLine(file);
}
}
io.File
请注意Windows Vista / Windows 7的安全权限-如果您以管理员身份运行Visual Studio,则在Visual Studio中运行文件时,将无法将非管理员资源管理器窗口中的文件拖到程序中。与拖动相关的事件甚至不会触发!我希望这可以帮助其他人不要浪费自己的时间。
在Windows窗体中,设置控件的AllowDrop属性,然后侦听DragEnter事件和DragDrop事件。
当DragEnter
事件触发时,将参数的值设置为非AllowedEffect
空(例如e.Effect = DragDropEffects.Move
)。
当DragDrop
事件触发时,你会得到一个字符串列表。每个字符串都是要删除的文件的完整路径。
您需要注意一个陷阱。您在拖放操作中作为DataObject传递的任何类都必须是可序列化的。因此,如果您尝试传递一个对象,但该对象不起作用,请确保可以对其进行序列化,因为这几乎可以肯定是问题所在。这吸引了我几次!
另一个常见的陷阱是您可以忽略Form DragOver(或DragEnter)事件。我通常使用Form的DragOver事件来设置AllowedEffect,然后使用特定控件的DragDrop事件来处理放置的数据。
这是我用来删除文件和/或充满文件的文件夹的内容。就我而言,我仅过滤*.dwg
文件,并选择包括所有子文件夹。
fileList
是一种IEnumerable
或类似的在我的情况下被绑定到WPF控件...
var fileList = (IList)FileList.ItemsSource;
有关该技巧的详细信息,请参见https://stackoverflow.com/a/19954958/492。
放置处理程序...
private void FileList_OnDrop(object sender, DragEventArgs e)
{
var dropped = ((string[])e.Data.GetData(DataFormats.FileDrop));
var files = dropped.ToList();
if (!files.Any())
return;
foreach (string drop in dropped)
if (Directory.Exists(drop))
files.AddRange(Directory.GetFiles(drop, "*.dwg", SearchOption.AllDirectories));
foreach (string file in files)
{
if (!fileList.Contains(file) && file.ToLower().EndsWith(".dwg"))
fileList.Add(file);
}
}
您可以在WinForms和WPF中实现拖放。
您应该添加mousemove事件:
private void YourElementControl_MouseMove(object sender, MouseEventArgs e)
{
...
if (e.Button == MouseButtons.Left)
{
DoDragDrop(new DataObject(DataFormats.FileDrop, new string[] { PathToFirstFile,PathToTheNextOne }), DragDropEffects.Move);
}
...
}
您应该添加DragDrop事件:
私人void YourElementControl_DragDrop(object sender,DragEventArgs e)
{
...
foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
{
File.Copy(path, DirPath + Path.GetFileName(path));
}
...
}