WPF, Перетягування (Drag and Drop)
WPF --- Основа WPF --- Перетягування (Drag and Drop)
Операції перетягування (спосіб отримання інформації з одного місця у вікні та приміщення її в інше місце) сьогодні не є настільки поширеними, як кілька років тому. Програмісти поступово перейшли інші методи копіювання інформації, які вимагають утримання натиснутої кнопки миші (багатьом користувачам це вдається важко). Програми, які підтримують перетягування часто пропонують його як швидкий варіант для досвідчених користувачів, а не як стандартний спосіб роботи.
Операції перетягування до WPF не зазнали істотних змін. Якщо ви використовували їх у програмах Windows Forms, то побачите, що програмний інтерфейс WPF залишився практично таким же. Ключовою відмінністю є те, що методи та події, що використовуються в операціях перетягування, зосереджені в класі System.Windows.DragDrop і через нього доступні іншим класам (наприклад, UIElement).
По суті, операція перетягування виконується у три етапи:
Користувач клацає на елементі (або виділяє деяку область усередині нього) і утримує кнопку миші. У цей момент зберігається деяка інформація та починається виконання операції перетягування.
Користувач переміщує курсор на інший елемент. Якщо цей елемент може приймати тип вмісту, що перетягується (наприклад, зображення або фрагмент тексту), вказівник миші набирає вигляду значка перетягування. Інакше покажчик миші набуває вигляду перекресленого кружка.
Коли користувач відпускає кнопку миші, елемент отримує інформацію та приймає рішення про її подальшу долю. Цю операцію можна скасувати, натиснувши клавішу (коли кнопка миші ще не відпущена).
Ви можетеспробувати, як працює перетягування, додавши у вікно два об'єкти TextBox, т.к. елемент TextBox має вбудовану логіку для підтримки операції перетягування. Якщо вибрати фрагмент тексту всередині текстового поля, його можна перетягнути в інше текстове поле. Коли ви відпустите кнопку миші, текст буде переміщено. Ті ж принципи поширюються і на взаємодію програм — наприклад, можна перетягнути шматок тексту з документа Word до об'єкта WPF TextBox, або навпаки.
Іноді буває необхідно дозволити перетягування між елементами, що не володіють такою вбудованою можливістю. Наприклад, потрібно зробити так, щоб користувач міг перетягувати вміст із текстового поля на мітку. У такій ситуації доведеться обробляти події перетягування:
Зазвичай метод DoDragDrop() викликається у відповідь подію MouseDown або PreviewMouseDown. Для операції перетягування використовується текстовий вміст мітки.
Властивість AllowDrop елемента, який приймає дані, має мати значення true. Крім того, цей елемент повинен опрацювати подію Drop, щоб оперувати даними.



Коли властивості AllowDrop надається значення true, елементу дозволяється приймати будь-який тип інформації. Якщо потрібно великі можливості, можна обробляти подію DragEnter. У цей момент можна перевірити тип даних, що перетягуються, а потім визначити тип дозволеної операції.
Операція перетягування дозволяє обмінюватись об'єктами будь-яких типів. Цей вільний підхід цілком підходить для ваших програм, але його не рекомендується застосовувати, якщо вам потрібно спілкуватися з іншими програмами. У цьому випадку слід використовувати один із базових типів даних (наприклад, рядки, цілі числа тощо) або об'єкт, який реалізує інтерфейсISerializable або IDataObject (що дозволить .NET передавати ваш об'єкт у вигляді потоку байтів і заново створювати об'єкт у домені іншої програми). Цікавим прийомом є перетворення елемента WPF XAML з подальшою його реконструкцією в іншому місці. Все, що для цього потрібно – об'єкти XamlWriter та XamlReader.