Перетаскивание
Перетаскивание является интуитивно понятным способом передачи данных в приложении или между приложениями на компьютере с Windows. Перетаскивание дает пользователю возможность перемещать данные между приложениями или внутри приложения с помощью стандартного жеста («нажатие-удержание-сдвиг» с помощью пальца или «нажатие-сдвиг» с помощью мыши или пера).
Источник перетаскивания, который является приложением или областью, в которой запускается жест перетаскивания, предоставляет данные для передачи путем заполнения объекта пакета данных, который может содержать стандартные форматы данных, включая текст, RTF, HTML, точечные рисунки, элементы хранилища или пользовательские форматы данных. Источник также обозначает тип операций, которые он поддерживает: копировать, переместить или ссылка. При освобождении указателя выполняется перетаскивание. Место переноса, которое является приложением или областью под указателем, обрабатывает пакет данных и возвращает тип выполненной операции.
Во время перетаскивания пользовательский интерфейс перетаскивания предоставляет визуальную индикацию типа выполняемой операции перетаскивания. Эта визуальная обратная связь изначально предоставляется источником, но может быть изменена местом переноса при наведении на них указателя.
Современная функция перетаскивания доступна на всех устройствах, поддерживающих UWP. Эта функция позволяет передавать данные между приложениями любого типа либо внутри самого приложения, включая классические Windows-приложения. Тем не менее в этой статье основное внимание уделяется API-интерфейсу XAML для современной операции перетаскивания. После реализации функции перетаскивание корректно работает во всех направлениях, в том числе из приложения UWP в приложение UWP, из приложения UWP в классическое приложение и из классического приложения в приложение UWP.
Здесь приведен обзор действий по реализации функции перетаскивания в вашем приложении.
Включение перетаскивания
Чтобы включить возможность перетаскивания элемента, задайте его свойству CanDrag значение true. Это делает элемент и содержащиеся в нем элементы в случае коллекций, например ListView, с помощью перетаскивания.
Определите, какие элементы будут поддерживать перетаскивание. Пользователям не требуется перетаскивать все содержимое в вашем приложении; только определенные элементы, такие как изображения и текст.
Чтобы разрешить перетаскивание, больше ничего делать не нужно, если только вы не собираетесь менять пользовательский интерфейс (об этом рассказывается дальше в статье). Для настройки завершения перетаскивания придется выполнить некоторые действия.
Создание пакета данных
В большинстве случаев система будет создавать пакет данных за вас. Система автоматически обрабатывает:
При работе с другим содержимым необходимо обработать события DragStarted и DragCompleted и использовать их для создания собственного пакета данных DataPackage.
Включение отпускания
Следующая разметка демонстрирует, как сделать отпускание доступным для конкретной области приложения, используя AllowDrop в XAML. Если пользователь попытается отпустить перетаскиваемое содержимое в другом месте, система не позволит сделать это. Если вы хотите, чтобы пользователи могли использовать перетаскивание в любом месте вашего приложения, установите весь фон в качестве места переноса.
Обработка события DragOver
Событие DragOver возникает, когда пользователь перетаскивает элемент в приложении, но еще не завершил этот процесс. В этом обработчике необходимо с помощью свойства AcceptedOperation выбрать, какой вид операции будет поддерживать ваше приложение. Наиболее распространено копирование.
Обработка завершения перетаскивания
Событие Drop возникает, когда пользователь отпускает элементы в допустимой области приложения. Обработайте их с помощью свойства DataView.
Для простоты в примере ниже предположим, что пользователь перетащил одну фотографию напрямую. На самом деле пользователи могут перетаскивать несколько элементов разных форматов одновременно. Ваше приложение должно обрабатывать эту возможность, проверяя, какие типы файлов были перемещены перетаскиванием и сколько файлов существует, и обрабатывать каждый из них соответствующим образом. Вам также необходимо решить, следует ли уведомить пользователей, если они пытаются сделать что-то, что ваше приложение не поддерживает.
Настройка пользовательского интерфейса
Система предоставляет пользовательский интерфейс по умолчанию для перетаскивания. Также можно настроить различные области пользовательского интерфейса, например пользовательские заголовки и глифы, или вообще отключить отображение пользовательского интерфейса. Чтобы настроить пользовательский интерфейс, используйте свойство DragEventArgs.DragUIOverride.
Открытие контекстного меню на элементе, который можно перетаскивать с помощью сенсорного управления
При использовании сенсорного управления перетаскивание UIElement и открытие его контекстного меню выполняются аналогичными сенсорными жестами, каждый из которых начинается с нажатия и удерживания. Вот как система различает эти два действия над элементами в вашем приложении, поддерживающими оба действия:
Обозначение элемента в ListView или GridView в качестве папки
Вы можете указать ListViewItem или GridViewItem как папку. Это особенно удобно в сценариях TreeView и проводника. Для этого явно задайте свойству AllowDrop значение True для этого элемента.
Система автоматически отобразит соответствующие анимации перетаскивания в папку в противоположность элементу, не являющемся папкой. Код вашего приложения должен продолжать обрабатывать событие Drop элемента папки (а также элемента, не являющегося папкой), чтобы обновить источник данных и добавить перетаскиваемый элемент в целевую папку.
Включение изменения порядка перетаскивания в ListView
Реализация пользовательской функции перетаскивания
Класс UIElement выполняет большую часть работы по реализации функции перетаскивания за вас. Но при необходимости можно реализовать собственную версию с помощью API-интерфейсов в Windows. Пространство имен ApplicationModel. передает. DragDrop. Core.
Перетаскивание мышью в Windows — компьютерные уроки
Перетаскивание — этот неуклюжий термин по-английски называется drag— and— drop.
Прием выполняется точно так же, как и протягивание, но используется для перемещения объектов. Перетаскиваемые объекты должны быть предварительно выделены.
Для примера щелкните левой кнопкой мыши на значке Мой компьютер — произойдет его выделение. Не отпуская кнопку мыши, переместите значок в другое место Рабочего стола и там отпустите. Значок займет новое положение.
Перемещать с помощью мыши можно и окна. Каждое окно имеет строку заголовка — за нее и выполняется перемещение. С помощью приема перетаскивания можно запускать программы, открывать и даже обрабатывать документы.
Попробуйте, например, перетащить значок документа на значок программы, которая предназначена для работы с ним Одновременно произойдет и запуск программы, и открытие в ней доку мента. Кстати, это не обязательно делать со значками — вполне годятся и ярлыки, как показано на рисунке ниже:
Специальное перетаскивание выполняется так же, как и обычное, но при нажатой правой кнопке мыши, а не левой. Действие похожее, а результат — другой. При обычном перетаскивании объект перемещается а при специальном перетаскивании действие можно выбрать.
Выбор нужной команды завершает операцию. По команде Переместить объект занимает новое положение, а его старая копия уничтожается.
По команде Копировать создается новая копия документа в новом месте, однако и старая копия продолжает существовать.
Если требуется удобный доступ к программе, документу или устройству, создайте нужное число ярлыков и расположите их в удобных местах.
Допустим, вы хотите узнать, что содержится на жестком диске (диск С:) компьютера. Однако на Рабочем столе значка диска С: вы не найдете.
Откройте окно — Мой компьютер и разыщите в нем значок диска С:. Дважды щелкните на этом значке — откроется окно, в котором представлено содержимое диска. Закройте его щелчком на закрывающей кнопке (кнопка «х» в правом верхнем углу окна).
Давайте подумаем, как сделать, чтобы обеспечить доступ к диску С: не из окна Мой компьютер, а непосредственно с Рабочего стола.
Попробуйте методом перетаскивания скопировать значок С: из окна — Мой компьютер на Рабочий стол. У вас ничего не выйдет. Это должно быть понятно: жесткий диск с именем С: на компьютере только один, и никаких копий у него быть не может.
Теперь попробуйте воспользоваться методом специального перетаскивания при нажатой правой кнопке мыши и создать ярлык жесткого диска на Рабочем столе. Эта операция пройдет успешно, поскольку вы не создаете новых копий жесткого диска, а просто устанавливаете на него указатель (вот именно его можно удалить при необходимости). Убедитесь в том, что двойной щелчок на ярлыке точно так же открывает содержимое жесткого диска, как и двойной щелчок на основном значке.
Теперь давайте установим различия между значком объекта и ярлыком значка объекта.
Щелкните правой кнопкой мыши на значке диска С: и выберите в контекстном меню пункт — Свойства. В открывшемся диалоговом окне вы увидите свойства диска: объем, размер свободного пространства и другие. То есть значок представляет объект, он ему соответствует и обеспечивает доступ к его свойствам.
Теперь щелкните правой кнопкой мыши на ярлыке значка диска С: и снова выберите в контекстном меню пункт Свойства. Вы увидите, что в этом случае нет никаких свойств диска С: система вам не покажет —только свойства самого ярлыка.
Таким образом, ярлык не представляет того объекта, который с ним связан, и не обеспечивает доступ к его свойствам. Это только указатель. Точно так же указатель «Гастроном за углом» помогает найти гастроном, но отнюдь его не заменяет ;).
Перетаскивание значка с помощью правой кнопки — самый удобный, хотя и не единственный способ создания ярлыков. Сделайте себе ярлык значка — Мой компьютер на Панели быстрого запуска. В будущем он не раз вам пригодится.
Общие сведения о перетаскивании
В этой статье приведены общие сведения о поддержке перетаскивания в приложениях Windows Presentation Foundation (WPF). Перетаскиванием обычно называют метод передачи данных, который реализуется с помощью мыши (или другого указывающего устройства) для выбора одного или нескольких объектов и перетаскивания их в цель перетаскивания в пользовательский интерфейс.
Поддержка перетаскивания в WPF
В операциях перетаскивания обычно участвуют две стороны: источник перетаскивания, из которого происходит перетаскиваемый объект, и цель перетаскивания, которая получает перетаскиваемый объект. Источник перетаскивания и цель перетаскивания могут быть элементами пользовательского интерфейса в одном приложении или в разных приложениях.
Можно перетаскивать совершенно произвольные типы и количества объектов. Например, в качестве наиболее распространенных объектов перетаскивания можно назвать файлы, папки, выбранное содержимое.
Конкретные действия, выполняемые во время операции перетаскивания, зависят от приложения и часто определяются контекстом. Например, перетаскивание выбранных файлов из одной папки в другую на одном устройстве хранения перемещает файлы по умолчанию, тогда как при перетаскивании файлов из общего ресурса UNC в локальную папку файлы копируются по умолчанию.
В средствах перетаскивания, предоставляемых WPF, предусмотрена высокая гибкость и возможность настройки с целью поддержки различных сценариев перетаскивания. Перетаскивание поддерживает управление объектами в рамках одного приложения или в разных приложениях. WPFТакже полностью поддерживаются перетаскивание между приложениями и другими приложениями Windows.
В WPF любые элементы UIElement или ContentElement могут участвовать в операциях перетаскивания. События и методы, необходимые для операций перетаскивания, определяются в классе DragDrop. Классы UIElement и ContentElement содержат псевдонимы для вложенных событий DragDrop, чтобы эти события отображались в списке членов класса, когда UIElement или ContentElement наследуется как базовый элемент. Обработчики событий, связанные с этими событиями, присоединяются к основному вложенному событию DragDrop и получают один и тот же экземпляр данных события. Дополнительные сведения см. в описании события UIElement.Drop.
Перетаскивание OLE не работает в зоне Интернета.
Передача данных
Перетаскивание является частью более общей сферы передачи данных. Передача данных включает операции перетаскивания и операции копирования и вставки. Операция перетаскивания аналогична операции копирования и вставки или вырезания и вставки, которая используется для передачи данных из одного объекта или приложения в другое с использованием буфера обмена. В обоих типах операций требуется:
исходный объект, предоставляющий данные;
способ временного хранения передаваемых данных;
целевой объект, который получает данные.
В операции копирования и вставки для временного хранения передаваемых данных используется системный буфер обмена; в операции перетаскивания для хранения данных используется DataObject. Концептуально объект данных состоит из одной или нескольких пар Object, содержащих фактические данные и соответствующий идентификатор формата данных.
Источник перетаскивания инициирует операцию перетаскивания путем вызова статического метода DragDrop.DoDragDrop и передачи в него передаваемых данных. Метод DoDragDrop будет автоматически включать данные в DataObject при необходимости. Для большего контроля над форматом данных можно включать данные в DataObject перед их передачей в метод DoDragDrop. Цель перетаскивания отвечает за извлечение данных из DataObject. Дополнительные сведения о работе с объектами данных см. в разделе Данные и объекты данных.
Исходный и целевой объекты операции перетаскивания являются элементами пользовательского интерфейса; однако данные, которые в действительности передаются, обычно не имеют визуального представления. Вы можете написать код для визуального представления перетаскиваемых данных, например такого, которое происходит при перетаскивании файлов в проводнике. По умолчанию взаимодействие предоставляется пользователю путем изменения курсора для представления воздействия, которое операция перетаскивания оказывает на данные: например, перемещаются данные или копируются.
Эффекты перетаскивания
Операции перетаскивания могут по-разному воздействовать на передаваемые данные. Например, данные могут копироваться или перемещаться. WPF задает перечисление DragDropEffects, которое можно использовать для указания эффекта операции перетаскивания. В источнике перетаскивания можно указать эффекты, которые он разрешает, в методе DoDragDrop. В цели перетаскивания можно определить ожидаемый эффект в свойстве Effects класса DragEventArgs. Если в цели перетаскивания ожидаемый эффект задан в событии DragOver, то информация передается обратно в источник перетаскивания в событии GiveFeedback. Источник перетаскивания использует эти сведения для информирования пользователей, какое воздействие на данные ожидает цель перетаскивания. Когда данные вставляются, цель перетаскивания указывает фактический эффект в событии Drop. Эти сведения передаются обратно в источник перетаскивания в качестве возвращаемого значения метода DoDragDrop. Если цель перетаскивания возвращает эффект, которого нет в списке allowedEffects источников перетаскивания, операция перетаскивания отменяется без фактической передачи данных.
Важно помнить, что в WPF значения DragDropEffects используются только для обеспечения взаимодействия между источником перетаскивания и целью перетаскивания относительно эффектов операции перетаскивания. Фактический эффект операции перетаскивания зависит от соответствующего кода, написанного вами в приложении.
Например, цель перетаскивания может указывать, что в результате перетаскивания в него данных должно происходить перемещение данных. Однако для перемещения данных они должны добавляться в целевой элемент и удаляться из исходного элемента. Исходный элемент может указывать, что он разрешает перемещение данных, но если вы не предоставите код для удаления данных из исходного элемента, данные в итоге будут копироваться, а не перемещаться.
События перетаскивания
Операции перетаскивания поддерживают модель управления событиями. Источник и цель перетаскивания используют стандартный набор событий для обработки операций перетаскивания. В следующих таблицах приведены стандартные события перетаскивания. Это вложенные события в классе DragDrop. Дополнительные сведения о вложенных событиях см. в разделе Общие сведения о вложенных событиях.
События источника перетаскивания
| Событие | Итоги |
|---|---|
| GiveFeedback | Это событие возникает постоянно во время операции перетаскивания и позволяет источнику перетаскивания предоставлять пользователю сведения о взаимодействии. Взаимодействие обычно демонстрируется путем изменения вида курсора мыши, чтобы указать разрешенные целью перетаскивания эффекты операции перетаскивания. Это событие восходящей маршрутизации. |
| QueryContinueDrag | Это событие возникает при изменении состояния клавиши клавиатуры или кнопки мыши во время операции перетаскивания и позволяет источнику перетаскивания отменить операцию перетаскивания в зависимости от состояния клавиши или кнопки. Это событие восходящей маршрутизации. |
| PreviewGiveFeedback | Это версия нисходящей маршрутизации события GiveFeedback. |
| PreviewQueryContinueDrag | Это версия нисходящей маршрутизации события QueryContinueDrag. |
События цели перетаскивания
| Событие | Итоги |
|---|---|
| DragEnter | Это событие происходит, когда объект перетаскивается в границы цели перетаскивания. Это событие восходящей маршрутизации. |
| DragLeave | Это событие происходит, когда объект перетаскивается за пределы цели перетаскивания. Это событие восходящей маршрутизации. |
| DragOver | Это событие происходит постоянно, когда объект перетаскивается (перемещается) в границы цели перетаскивания. Это событие восходящей маршрутизации. |
| Drop | Это событие происходит, когда объект вставляется в цель перетаскивания. Это событие восходящей маршрутизации. |
| PreviewDragEnter | Это версия нисходящей маршрутизации события DragEnter. |
| PreviewDragLeave | Это версия нисходящей маршрутизации события DragLeave. |
| PreviewDragOver | Это версия нисходящей маршрутизации события DragOver. |
| PreviewDrop | Это версия нисходящей маршрутизации события Drop. |
Для обработки событий перетаскивания для экземпляров объекта добавьте обработчики событий, перечисленных в таблицах выше. Для обработки событий перетаскивания на уровне класса переопределите соответствующие виртуальные методы On*Event и On*PreviewEvent. Дополнительные сведения см. в разделе Маркировка перенаправленных событий как обработанных и обработка классов.
Реализация перетаскивания
Элемент пользовательского интерфейса может быть источником перетаскивания, целью перетаскивания или и тем, и другим. Чтобы реализовать базовое перетаскивание, необходимо написать код для инициирования операции перетаскивания и обработки перетаскиваемых данных. Вы можете улучшить взаимодействие перетаскивания путем обработки дополнительных событий перетаскивания.
Для реализации базового перетаскивания вы будете выполнять следующие задачи.
Определение элемента, который будет источником перетаскивания. Источник перетаскивания может быть UIElement или ContentElement.
Создание обработчика событий в источнике перетаскивания, который будет инициировать операцию перетаскивания. Это событие обычно является событием MouseMove.
Вызов метода DoDragDrop в обработчике событий источника перетаскивания для инициации операции перетаскивания. Указание источника перетаскивания, передаваемых данных и разрешенные эффекты в вызове метода DoDragDrop.
Определение элемента, который будет целью перетаскивания. Целью перетаскивания может быть UIElement или ContentElement.
В цели перетаскивания создайте обработчик событий Drop для обработки перетаскиваемых данных.
В обработчике событий Drop извлеките данные из DragEventArgs с помощью методов GetDataPresent и GetData.
В обработчике событий Drop используйте эти данные для выполнения требуемой операции перетаскивания.
Вы можете улучшить реализацию перетаскивания путем создания пользовательского объекта DataObject и обработки дополнительных событий источника и цели перетаскивания, как показано в следующих задачах.
Чтобы передать пользовательские данные или несколько элементов данных, создайте объект DataObject для передачи в метод DoDragDrop.
Для выполнения дополнительных действий в процессе перетаскивания обработайте события DragEnter, DragOver и DragLeave в цели перетаскивания.
Чтобы изменить вид курсора мыши, обработайте событие GiveFeedback в источнике перетаскивания.
Для изменения способа отмены операции перетаскивания обработайте событие QueryContinueDrag в источнике перетаскивания.
Пример перетаскивания
В этом разделе описывается реализация перетаскивания для элемента Ellipse. Элемент Ellipse является как источником, так и целью перетаскивания. Передаваемые данные — это строковое представление свойства Fill эллипса. В следующем XAML показан элемент Ellipse и связанные с перетаскиванием события, которые он обрабатывает. Полное описание действий по реализации перетаскивания см. в разделе Пошаговое руководство. Включение перетаскивания для пользовательского элемента управления.
Включение элемента в качестве источника перетаскивания
Объект, являющийся источником перетаскивания, отвечает за:
определение момента начала перетаскивания;
инициализацию операции перетаскивания;
определение передаваемых данных;
указание разрешенного воздействия операции перетаскивания на передаваемые данные.
Источник перетаскивания может также предоставить пользователю сведения о разрешенных действиях (перемещение, копирование или отсутствие действий) и может отменять операцию перетаскивания на основании дополнительного пользовательского ввода, например нажатия клавиши ESC во время перетаскивания.
Ваше приложение должно определить, когда происходит перетаскивание, а затем инициировать операцию перетаскивания путем вызова метода DoDragDrop. Обычно это происходит, когда возникает событие MouseMove в перетаскиваемом элементе при нажатой клавише мыши. В следующем примере показано, как инициировать операцию перетаскивания в обработчике событий MouseMove элемента Ellipse, чтобы сделать его источником перетаскивания. Передаваемые данные — это строковое представление свойства Fill эллипса.
В обработчике событий MouseMove вызовите метод DoDragDrop для инициации операции перетаскивания. Метод DoDragDrop принимает три следующих параметра.
dragSource — ссылка на объект зависимости, который является источником передаваемых данных; обычно это источник события MouseMove.
data — объект, содержащий передаваемые данные, заключенные в объект DataObject.
allowedEffects — одно из значений перечисления DragDropEffects, которое определяет разрешенные эффекты операции перетаскивания.
В параметр data может быть передан любой сериализуемый объект. Если данные еще не заключены в объект DataObject, они автоматически заключаются в новый объект DataObject. Для передачи нескольких элементов данных вы должны создать объект DataObject самостоятельно и передать его в метод DoDragDrop. Дополнительные сведения см. в разделе Данные и объекты данных.
Параметр allowedEffects используется для указания, какие действия с передаваемыми данными источник перетаскивания будет разрешать цели перетаскивания. Обычные значения для источника перетаскивания — Copy, Move и All.
Цель перетаскивания также может указывать ожидаемые эффекты перетаскивания данных. Например, если цель перетаскивания не распознает тип вставляемых данных, то она может отклонить эти данные, задав None в качестве разрешенных эффектов. Обычно она делает это в своем обработчике событий DragOver.
Источник перетаскивания может также обрабатывать события GiveFeedback и QueryContinueDrag. Эти события имеют обработчики по умолчанию, которые используются, если события не помечены как обработанные. Обычно эти события игнорируются, если нет особой необходимости изменения их поведения по умолчанию.
Событие GiveFeedback возникает постоянно, пока выполняется перетаскивание источника перетаскивания. Обработчик по умолчанию для этого события проверяет, находится ли источник перетаскивания над допустимым конечным расположением сброса. Если это так, то он проверяет разрешенные эффекты цели перетаскивания. Затем он предоставляет конечному пользователю отзыв относительно разрешенных эффектов перетаскивания. Обычно это выполняется путем изменения курсора мыши, чтобы указать запрет перетаскивания, копирование или перемещение. Это событие следует обрабатывать, только если необходимо использовать пользовательские курсоры для предоставления отзыва пользователю. Если вы обрабатываете это событие, не забудьте помечать его как обработанное, чтобы обработчик по умолчанию не переопределил ваш обработчик.
Событие QueryContinueDrag возникает постоянно, пока выполняется перетаскивание источника перетаскивания. Можно обработать это событие, чтобы определить, какое действие завершает операцию перетаскивания, на основе состояния клавиш ESC, SHIFT, CTRL и ALT, а также состояния кнопок мыши. Обработчик по умолчанию для этого события отменяет операцию перетаскивания при нажатии клавиши ESC и сбрасывает данные при отпускании кнопки мыши.
Эти события возникают постоянно во время операции перетаскивания. Поэтому следует избегать ресурсоемких задач в обработчиках событий. Например, используйте кэшированный курсор вместо создания нового курсора при каждом возникновении события GiveFeedback.
Включение элемента в качестве цели перетаскивания
Объект, являющийся целью перетаскивания, отвечает за:
указание, что он является допустимой целью перетаскивания;
реакцию на источник перетаскивания, когда он перетаскивается над целевым объектом;
проверку, что передаваемые данные находятся в формате, который он может получить;
обработку вставляемых данных.
Событие DragEnter возникает, когда данные перетаскиваются в границы цели перетаскивания. Обычно вы обрабатываете это событие, чтобы обеспечить предварительный просмотр эффектов операции перетаскивания, если это требуется для вашего приложения. Не устанавливайте свойство DragEventArgs.Effects в событии DragEnter, так как оно будет переопределено в событии DragOver.
В следующем примере показан обработчик событий DragEnter для элемента Ellipse. Этот код выполняет предварительный просмотр эффектов операции перетаскивания путем сохранения текущей кисти Fill. Затем он использует метод GetDataPresent для проверки, содержит ли объект DataObject, перетаскиваемый над эллипсом, строковые данные, которые можно преобразовать в Brush. Если да, то данные извлекаются с помощью метода GetData Затем они преобразуются в Brush и применяются к эллипсу. Это изменение отменяется в обработчике событий DragLeave. Если данные невозможно преобразовать в Brush, никакие действия не выполняются.
Событие DragOver постоянно возникает при перетаскивании данных на цель перетаскивания. Это событие является спаренным с событием GiveFeedback в источнике перетаскивания. В обработчике событий DragOver, как правило, используются методы GetDataPresent и GetData для проверки, имеют ли передаваемые данные формат, который может обработать цель перетаскивания. Можно также проверить, нажаты ли клавиши-модификаторы, которые обычно указывают, какую операцию предполагает выполнять пользователь — перемещения или копирования. После выполнения этих проверок вы устанавливаете свойство DragEventArgs.Effects, чтобы уведомить источник перетаскивания о том, какой эффект окажет сброс данных. Источник перетаскивания получает эти сведения в аргументах события GiveFeedback и может задать соответствующий курсор, чтобы обеспечить отзыв для пользователя.
В следующем примере показан обработчик событий DragOver для элемента Ellipse. В этом коде проверяется, содержит ли объект DataObject, перетаскиваемый над эллипсом, строковые данные, которые можно преобразовать в Brush. Если содержит, то код устанавливает для свойства DragEventArgs.Effects значение Copy. Это указывает источнику перетаскивания, что данные можно скопировать в эллипс. Если данные невозможно преобразовать в Brush, для свойства DragEventArgs.Effects устанавливается значение None. Это указывает источнику перетаскивания, что эллипс не является допустимым конечным расположением сброса для данных.
Событие DragLeave возникает, когда данные перетаскиваются за границу целевого объекта без сбрасывания. Обработка этого события позволяет отменить любые действия, которые были выполнены в обработчике событий DragEnter.
В следующем примере показан обработчик событий DragLeave для элемента Ellipse. Этот код отменяет предварительный просмотр, выполненный в обработчике событий DragEnter, путем применения сохраненного объекта Brush к эллипсу.
Событие Drop возникает при сбросе данных в цель перетаскивания; по умолчанию это происходит при отпускании кнопки мыши. В обработчике событий Drop вы используете метод GetData для извлечения передаваемых данных из объекта DataObject и выполнения обработки данных, необходимой для вашего приложения. Событие Drop завершает операцию перетаскивания.
В следующем примере показан обработчик событий Drop для элемента Ellipse. Этот код применяет эффекты операции перетаскивания. Он аналогичен коду в обработчике событий DragEnter. Он проверяет, содержит ли объект DataObject, перетаскиваемый над эллипсом, строковые данные, которые можно преобразовать в Brush. Если это так, то к эллипсу применяется объект Brush. Если данные невозможно преобразовать в Brush, никакие действия не выполняются.




