Я видел, как это делается в среде Borland Turbo C ++, но я не знаю, как это сделать. об этом для приложения C #, над которым я работаю. Есть ли лучшие практики или подводные камни, на которые следует обратить внимание?
Как перетащить файлы в приложение?
Ответы (10)
Пример кода:
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
- person Smith; 25.05.2013
this.AllowDrop? stackoverflow.com/questions/119506/ а>
- person CJBS; 11.02.2014
(string[]) преобразование для любой капли, отформатированной в FileDrop? То есть возможно ли сгенерировать FileDrop, которое вызовет недопустимое исключение приведения к string[]? У меня проблемы с выяснением этого из документов.
- person kdbanman; 11.08.2015
Enter и Drop?
- person DjangoBlockchain; 01.03.2018
Помните о правах безопасности Windows Vista / Windows 7 - если вы запускаете Visual Studio от имени администратора, вы не сможете перетаскивать файлы из окна проводника без прав администратора в свою программу при запуске из Visual Studio. События, связанные с перетаскиванием, даже не сработают! Я надеюсь, что это поможет кому-то еще не тратить впустую часы своей жизни ...
В Windows Forms установите свойство AllowDrop элемента управления, затем прослушайте событие DragEnter и событие DragDrop.
Когда срабатывает событие DragEnter, установите для аргумента AllowedEffect значение, отличное от none (например, e.Effect = DragDropEffects.Move).
Когда срабатывает событие DragDrop, вы получите список строк. Каждая строка - это полный путь к удаляемому файлу.
Вы должны знать об ошибке. Любой класс, который вы передаете как DataObject в операции перетаскивания должен быть Serializable. Поэтому, если вы пытаетесь передать объект, но он не работает, убедитесь, что он может быть сериализован, поскольку это почти наверняка проблема. Пару раз меня это зацепило!
Еще одна проблема:
Код фреймворка, вызывающий события перетаскивания, поглощает все исключения. Вы можете подумать, что ваш код события работает без сбоев, в то время как исключения возникают повсюду. Вы не можете их видеть, потому что их крадет фреймворк.
Вот почему я всегда добавляю try / catch в эти обработчики событий, чтобы я знал, генерируют ли они какие-либо исключения. Я обычно ставлю Debugger.Break (); в части улова.
Перед выпуском, после тестирования, если все работает нормально, я удаляю или заменяю их реальной обработкой исключений.
Еще одна распространенная проблема - думать, что вы можете игнорировать события Form DragOver (или DragEnter). Обычно я использую событие 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);
}
}
Вы можете реализовать Drag & Drop в WinForms и WPF.
- WinForm (перетащите из окна приложения)
Вы должны добавить событие 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);
}
...
}
- WinForm (перетащите в окно приложения)
Вам следует добавить событие DragDrop:
private void YourElementControl_DragDrop (отправитель объекта, DragEventArgs e)
{
...
foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
{
File.Copy(path, DirPath + Path.GetFileName(path));
}
...
}
Обратите внимание, что для этого вам также необходимо установить dragDropEffect в _drawEnter ...
private void Form1_DragEnter(object sender, DragEventArgs e)
{
Console.WriteLine("DragEnter!");
e.Effect = DragDropEffects.Copy;
}
Источник: Перетаскивание не работает в приложении C # Winforms < / а>

