Перетягування (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-ukДля спрощення логіки програми додамо новий клас 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 для реалізації перетягування.

Share this Post

Leave a Comment