Перетаскивание (drag-and-drop) на c#

working-woman
При разработке приложений для рабочего стола с использованием технологии WPF или WinForm можно наткнуться на потребность в имплементации drag-and-drop эффекта. Это упростит манипуляции с файлами между браузером, файловой системой и вашими приложениями.
Чтобы усвоить материал примера ниже советую знать:

  1. Базовые принципы Объектно-ориентированного программирования
  2. Как создавать WPF или WinForm проекты

Чтобы заставить пример работать нужно уметь работать с Visual Studio.

Drag & Drop в WPF .Net Core/Framework

  1. Создать WPF проект
  2. Добавить элемент ListView на главное окно
  3. Добавить Drop и MouseMove handler в элемент ListView

wpf-project-ru
Чтобы упростить логику программы добавим новый класс FileObject, который будет содержать Name (image.jpeg, essay.txt etc) и Fullname (C:/somefolder/image.jpeg, E:/myessays/essay.txt etc):

...
    class FileObject
    {
        public string Name { get; set; }

        public string FullName { get; set; }

        public FileObject(string name, string fullname)
        {
            Name = name;
            FullName = fullname;
        }

        public override string ToString()
        {
            return Name;
        }
    } 
...

Благодаря следующему коду пользователь сможет:

  • перетаскивать файлы в список
  • перетаскивать файлы из списка

Перетаскивая файлы в элемент ListView, возможно обработать событие перетаскивания и получить полный путь к перетаскиваемому файлу.

...
   public readonly string DirPath = AppDomain.CurrentDomain.BaseDirectory; /*путь к директории исполняемого файла*/

   private void VashElementUpravleniya_Drop(object sender, DragEventArgs e)
   {
     string[] file_pathes = (string[])e.Data.GetData(DataFormats.FileDrop); //массив file_pathes содержит пути к выбранным файлам или папкам при попытке перетащить

     foreach (var path in file_pathes) //добавление каждого файла в список, копируя их в директорию приложения
     {
        string new_path = DirPath+Path.GetFileName(path); //новый путь файла

        File.Copy(path, new_path); //копирование файла

        lv_list.Items.Add(new FileObject(Path.GetFileName(path), new_path)); //добавление в список элемента FileObject (который содержит информацию о файле)
     }
   }
...

Примечание: свойство Items элемента ListView можно наполнить любыми элементами (т.к. Items.Add(obj) принимает параметр типа object). Чтобы вывести список элементов ListView получает их текстовое представление, вызывая виртуальный метод ToString(), который переопределён в FileObject таким образом, что бы возвращать краткое имя файла (без полного пути).

Чтобы перетянуть какой-то файл из списка в какую-то директорию компьютера (или окно браузера и т.д.) нужно выбрать название файла в списке и перетащить его, удерживая левую кнопку мыши.

...
        private void VashElementUpravleniya_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
        {
            if (e.MouseDevice.LeftButton==System.Windows.Input.MouseButtonState.Pressed) //Проверка на удержание правой кнопки мыши
            {
                var file = lv_list.SelectedItem as FileObject; //получить экземпляр FileObject выбранного объекта
                if(file!=null) //проверить, что элемент выбран. Иначе file равен null
                DragDrop.DoDragDrop(this, new DataObject(DataFormats.FileDrop, new string[] { file.FullName }), DragDropEffects.Move);/*new string [] {...} - это массив путей файлов, которые скопируются в директорию, выбранную пользователем*/
                lv_list.Items.Remove(file);                   //убрать перетащенный файл из списка
            }
        }
...

Drag & Drop в WinForm .Net Core/Framework

Инструкции почти идентичные с приведенными выше:

  • Создать проект
  • Выбрать элемент Control (ListView, DataGridView, ListBox и т.д.)
  • Добавить обработку Drop и MouseMove в выбранный элемент Control
...
    private void VashElementUpravleniya_DragDrop(object sender, DragEventArgs e)
    {
       ...
       foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
            {
                File.Copy(path, DirPath + Path.GetFileName(path));
            }
       ...
    }

    private void VashElementUpravleniya_MouseMove(object sender, MouseEventArgs e)
    {
     ...
         if (e.Button == MouseButtons.Left)
         {
                 DoDragDrop(new DataObject(DataFormats.FileDrop, new string[] { ПутьКПервомуФайлу,ПутьКСледующему }), DragDropEffects.Move);
         }
     ...
    }
...

Примечание: можно применять перетаскивание и к файлам и к папкам. Также можно использовать много других элементов Control для реализации перетаскивания.

Поделиться этой записью

Оставить комментарий