Я видел это в Borland Turbo С++, но я не уверен, как это сделать для приложения С# Я работаю. Есть ли лучшие практики или gotchas, которые нужно искать?
Как перетащить файлы в приложение?
Ответ 1
Пример кода:
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);
}
}
Ответ 2
Помните о правах доступа Windows Vista/Windows 7 - если вы используете Visual Studio как администратор, вы не сможете перетаскивать файлы из окна неадминистратора в вашу программу, когда вы запускаете его из визуальной студии. События, связанные с перетаскиванием, даже не срабатывают! Надеюсь, это поможет кому-то еще не тратить часы своей жизни...
Ответ 3
В Windows Forms установите свойство AllowDrop элемента управления, затем прослушайте событие DragEnter и событие DragDrop.
Когда событие DragEnter
срабатывает, установите аргумент AllowedEffect
в значение, отличное от none (например, e.Effect = DragDropEffects.Move
).
Когда срабатывает событие DragDrop
, вы получите список строк. Каждая строка - это полный путь к отбрасываемому файлу.
Ответ 4
Вам нужно знать о получении. Любой класс, который вы передаете как DataObject в операции перетаскивания, должен быть Serializable. Поэтому, если вы попытаетесь передать объект, и он не работает, убедитесь, что он может быть сериализован, поскольку это почти наверняка проблема. Это вызвало у меня пару раз!
Ответ 5
Еще один вопрос:
Код рамки, который вызывает события перетаскивания, проглатывает все исключения. Вы могли бы подумать, что код вашего события работает плавно, в то время как он исключает все исключения. Вы не можете их видеть, потому что структура их крадет.
Вот почему я всегда ставил try/catch в этих обработчиках событий, поэтому я знаю, что они бросают какие-то исключения. Обычно я добавляю Debugger.Break(); в ловушке.
Перед выпуском, после тестирования, если все, кажется, ведет себя, я удаляю или заменяю их реальной обработкой исключений.
Ответ 6
Еще одна распространенная проблема заключается в том, что вы можете игнорировать события Form DragOver (или DragEnter). Обычно я использую событие Form DragOver, чтобы установить AllowedEffect, а затем конкретное событие управления DragDrop для обработки сброшенных данных.
Ответ 7
Вот что я использовал для удаления файлов и/или папок с файлами. В моем случае я фильтровался только для файлов *.dwg
и решил включить все подпапки.
fileList
является IEnumerable
или подобным. В моем случае он был связан с элементом управления WPF...
var fileList = (IList)FileList.ItemsSource;
Подробнее об этом трюке см. fooobar.com/info/32819/....
Обработчик капель...
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);
}
}