Что такое перетаскивание объекта в окнах

Обновлено: 03.07.2024

В этом разделе представлен обзор поддержки перетаскивания в пользовательском интерфейсе (UI) и их удаления.

Поддержка перетаскивания в WPF

Операции перетаскивания обычно включают две стороны: источник перетаскивания, из которого исходит перетаскиваемый объект, и цель перетаскивания, которая получает перетаскиваемый объект. Источник перетаскивания и цель перетаскивания могут быть элементами пользовательского интерфейса в одном и том же приложении или в другом приложении.

Тип и количество объектов, которыми можно управлять с помощью перетаскивания, совершенно произвольны. Например, файлы, папки и выборки контента являются одними из наиболее распространенных объектов, управляемых с помощью операций перетаскивания.

Конкретные действия, выполняемые во время операции перетаскивания, зависят от приложения и часто определяются контекстом. Например, перетаскивание выбранных файлов из одной папки в другую на том же устройстве хранения перемещает файлы по умолчанию, тогда как перетаскивание файлов из общей папки с универсальным соглашением об именах (UNC) в локальную папку копирует файлы по умолчанию.

Средства перетаскивания, предоставляемые WPF, отличаются высокой гибкостью и возможностью настройки для поддержки широкого спектра сценариев перетаскивания. Перетаскивание поддерживает управление объектами в одном приложении или между разными приложениями. Также полностью поддерживается перетаскивание между приложениями WPF и другими приложениями Windows.

В WPF любой UIElement или ContentElement может участвовать в перетаскивании. События и методы, необходимые для операций перетаскивания, определяются в классе DragDrop. Классы UIElement и ContentElement содержат псевдонимы для вложенных событий DragDrop, чтобы события отображались в списке членов класса, когда UIElement или ContentElement наследуется как базовый элемент. Обработчики событий, прикрепленные к этим событиям, присоединяются к базовому присоединенному событию DragDrop и получают один и тот же экземпляр данных события. Дополнительные сведения см. в описании события UIElement.Drop.

Перетаскивание OLE не работает в зоне Интернета.

Передача данных

Исходный объект, предоставляющий данные.

Способ временного хранения переданных данных.

Целевой объект, который получает данные.

В операции копирования и вставки системный буфер обмена используется для временного хранения переданных данных; в операции перетаскивания DataObject используется для хранения данных. Концептуально объект данных состоит из одной или нескольких пар объекта, который содержит фактические данные, и соответствующего идентификатора формата данных.

Источник перетаскивания инициирует операцию перетаскивания, вызывая статический метод DragDrop.DoDragDrop и передавая ему переданные данные. Метод DoDragDrop автоматически переносит данные в объект DataObject, если это необходимо. Для большего контроля над форматом данных вы можете обернуть данные в DataObject перед передачей их методу DoDragDrop. Цель перетаскивания отвечает за извлечение данных из DataObject. Дополнительные сведения о работе с объектами данных см. в разделе Данные и объекты данных.

Источником и целью операции перетаскивания являются элементы пользовательского интерфейса; однако фактически передаваемые данные обычно не имеют визуального представления. Вы можете написать код для обеспечения визуального представления перетаскиваемых данных, например, при перетаскивании файлов в проводнике Windows. По умолчанию обратная связь предоставляется пользователю путем изменения курсора, чтобы представить эффект, который операция перетаскивания окажет на данные, например, будут ли данные перемещены или скопированы.

Эффекты перетаскивания

Операции перетаскивания могут по-разному влиять на передаваемые данные. Например, вы можете копировать данные или перемещать данные. WPF определяет перечисление DragDropEffects, которое можно использовать для указания эффекта операции перетаскивания. В источнике перетаскивания вы можете указать эффекты, которые будет разрешать источник, в методе DoDragDrop. В цели перетаскивания вы можете указать эффект, который намеревается цель, в свойстве Effects класса DragEventArgs. Когда цель перетаскивания указывает предполагаемый эффект в событии DragOver, эта информация передается обратно в источник перетаскивания в событии GiveFeedback. Источник перетаскивания использует эту информацию, чтобы информировать пользователя о том, какой эффект цель перетаскивания намеревается оказать на данные. Когда данные удаляются, цель перетаскивания указывает фактический эффект в событии Drop. Эта информация передается обратно в источник перетаскивания в качестве возвращаемого значения метода DoDragDrop. Если цель перетаскивания возвращает эффект, которого нет в списке источников перетаскивания для allowEffects , операция перетаскивания отменяется без передачи данных.

Важно помнить, что в 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.

На цели перетаскивания задайте для свойства AllowDrop значение true .

В целевом объекте создайте обработчик событий Drop для обработки перетаскиваемых данных.

В обработчике событий Drop извлеките данные из DragEventArgs с помощью методов GetDataPresent и GetData.

В обработчике событий Drop используйте данные для выполнения нужной операции перетаскивания.

Вы можете улучшить реализацию перетаскивания, создав пользовательский объект DataObject и обработав дополнительные события источника и цели перетаскивания, как показано в следующих задачах:

Чтобы передать пользовательские данные или несколько элементов данных, создайте DataObject для передачи в метод DoDragDrop.

Чтобы выполнять дополнительные действия во время перетаскивания, обработайте события DragEnter, DragOver и DragLeave на цели перетаскивания.

Чтобы изменить внешний вид указателя мыши, обработайте событие GiveFeedback в источнике перетаскивания.

Чтобы изменить способ отмены операции перетаскивания, обработайте событие QueryContinueDrag в источнике перетаскивания.

Пример перетаскивания

В этом разделе описывается, как реализовать перетаскивание для элемента Ellipse. Эллипс является одновременно источником перетаскивания и целью перетаскивания. Передаваемые данные являются строковым представлением свойства Fill эллипса. В следующем коде XAML показан элемент Ellipse и события, связанные с перетаскиванием, которые он обрабатывает. Подробные инструкции по реализации перетаскивания см. в разделе Пошаговое руководство. Включение перетаскивания в пользовательском элементе управления.

Включение элемента в качестве источника перетаскивания

Объект, являющийся источником перетаскивания, отвечает за:

Определение момента перетаскивания.

Запуск операции перетаскивания.

Определение данных для передачи.

Указание эффектов, которые операция перетаскивания может оказывать на передаваемые данные.

Источник перетаскивания также может сообщать пользователю о разрешенных действиях (перемещение, копирование, ничего) и может отменить операцию перетаскивания на основе дополнительных действий пользователя, например нажатия клавиши ESC во время перетаскивания. .

Ваше приложение должно определить, когда происходит перетаскивание, а затем инициировать операцию перетаскивания, вызвав метод DoDragDrop. Как правило, это происходит, когда событие MouseMove происходит над перетаскиваемым элементом при нажатой кнопке мыши. В следующем примере показано, как инициировать операцию перетаскивания из обработчика событий MouseMove элемента Ellipse, чтобы сделать его источником перетаскивания. Передаваемые данные являются строковым представлением свойства Fill эллипса.

В обработчике событий MouseMove вызовите метод DoDragDrop, чтобы инициировать операцию перетаскивания. Метод DoDragDrop принимает три параметра:

dragSource — ссылка на объект зависимости, являющийся источником передаваемых данных; обычно это источник события MouseMove.

данные — объект, содержащий переданные данные, упакованные в DataObject.

allowedEffects — одно из значений перечисления DragDropEffects, указывающее разрешенные эффекты операции перетаскивания.

В качестве параметра данных можно передать любой сериализуемый объект. Если данные еще не упакованы в DataObject, они будут автоматически заключены в новый DataObject. Чтобы передать несколько элементов данных, вы должны сами создать DataObject и передать его методу DoDragDrop. Дополнительные сведения см. в разделе Данные и объекты данных.

Параметр allowEffects используется для указания того, что источник перетаскивания позволит цели перетаскивания делать с переданными данными. Общие значения для источника перетаскивания: «Копировать», «Переместить» и «Все».

Цель перетаскивания также может указать, какие эффекты она намеревается применить в ответ на перетаскиваемые данные. Например, если цель перетаскивания не распознает тип удаляемых данных, она может отказаться от данных, установив для разрешенных эффектов значение «Нет». Обычно это делается в обработчике событий DragOver.

Источник перетаскивания может дополнительно обрабатывать события GiveFeedback и QueryContinueDrag. Эти события имеют обработчики по умолчанию, которые используются, если вы не пометите события как обработанные. Обычно вы игнорируете эти события, если у вас нет особой необходимости изменить их поведение по умолчанию.

Событие GiveFeedback возникает постоянно, пока перетаскивается источник перетаскивания. Обработчик по умолчанию для этого события проверяет, находится ли источник перетаскивания над действительной целью перетаскивания. Если это так, он проверяет разрешенные эффекты цели перетаскивания. Затем он предоставляет конечному пользователю обратную связь относительно разрешенных эффектов перетаскивания. Обычно это делается путем изменения курсора мыши на курсор без отбрасывания, копирования или перемещения. Вы должны обрабатывать это событие только в том случае, если вам нужно использовать настраиваемые курсоры для предоставления обратной связи пользователю. Если вы обрабатываете это событие, обязательно пометьте его как обработанное, чтобы обработчик по умолчанию не переопределял ваш обработчик.

Событие QueryContinueDrag возникает постоянно во время перетаскивания источника перетаскивания. Вы можете обработать это событие, чтобы определить, какое действие завершает операцию перетаскивания, исходя из состояния клавиш ESC, SHIFT, CTRL и ALT, а также состояния кнопок мыши. Обработчик по умолчанию для этого события отменяет операцию перетаскивания, если нажата клавиша ESC, и удаляет данные, если отпустить кнопку мыши.

Эти события возникают постоянно во время операции перетаскивания. Поэтому следует избегать ресурсоемких задач в обработчиках событий. Например, используйте кешированный курсор вместо создания нового курсора каждый раз, когда вызывается событие GiveFeedback.

Включение элемента в качестве цели перетаскивания

Объект, являющийся целью перетаскивания, отвечает за:

Указание, что это допустимая цель перетаскивания.

Реакция на источник перетаскивания, когда он перетаскивает цель.

Проверка того, что переданные данные находятся в формате, который они могут получить.

Обработка сброшенных данных.

Чтобы указать, что элемент является целью перетаскивания, установите для его свойства AllowDrop значение true . Затем события перетаскивания будут вызваны для элемента, чтобы вы могли их обработать. Во время операции перетаскивания с целью перетаскивания происходит следующая последовательность событий:

Событие DragEnter возникает, когда данные перетаскиваются за границу цели перетаскивания. Обычно вы обрабатываете это событие, чтобы обеспечить предварительный просмотр эффектов операции перетаскивания, если это подходит для вашего приложения. Не устанавливайте свойство DragEventArgs.Effects в событии DragEnter, так как оно будет перезаписано в событии DragOver.

В следующем примере показан обработчик события DragEnter для элемента Ellipse. Этот код позволяет предварительно просмотреть эффекты операции перетаскивания путем сохранения текущей кисти «Заливка». Затем он использует метод GetDataPresent, чтобы проверить, содержит ли DataObject, перетаскиваемый по эллипсу, строковые данные, которые можно преобразовать в кисть. Если это так, данные извлекаются с помощью метода GetData. Затем он преобразуется в кисть и применяется к эллипсу. Изменение отменяется в обработчике событий DragLeave. Если данные не могут быть преобразованы в кисть, никаких действий не выполняется.

Событие DragOver происходит постоянно, пока данные перетаскиваются на цель перетаскивания. Это событие связано с событием GiveFeedback в источнике перетаскивания. В обработчике событий DragOver обычно используются методы GetDataPresent и GetData, чтобы проверить, имеют ли передаваемые данные формат, который может обработать цель перетаскивания. Вы также можете проверить, нажаты ли какие-либо клавиши-модификаторы, что обычно указывает, намеревается ли пользователь выполнить действие перемещения или копирования. После выполнения этих проверок вы устанавливаете свойство DragEventArgs.Effects, чтобы уведомить источник перетаскивания о том, какой эффект будет иметь удаление данных. Источник перетаскивания получает эту информацию в аргументах события GiveFeedback и может установить соответствующий курсор, чтобы отправить отзыв пользователю.

В следующем примере показан обработчик события DragOver для элемента Ellipse. Этот код проверяет, содержит ли DataObject, перетаскиваемый по эллипсу, строковые данные, которые можно преобразовать в кисть. Если это так, для свойства DragEventArgs.Effects задается значение Копировать. Это указывает источнику перетаскивания, что данные могут быть скопированы в эллипс. Если данные не могут быть преобразованы в кисть, свойство DragEventArgs.Effects имеет значение None. Это указывает источнику перетаскивания, что эллипс не является допустимой целью перетаскивания для данных.

Событие DragLeave возникает, когда данные перетаскиваются за границу цели, но не отбрасываются. Вы обрабатываете это событие, чтобы отменить все, что вы сделали в обработчике событий DragEnter.

В следующем примере показан обработчик события DragLeave для элемента Ellipse. Этот код отменяет предварительный просмотр, выполненный в обработчике событий DragEnter, применяя сохраненную кисть к эллипсу.

Событие Drop возникает, когда данные перебрасываются через цель перетаскивания; по умолчанию это происходит при отпускании кнопки мыши. В обработчике событий Drop вы используете метод GetData для извлечения переданных данных из DataObject и выполнения любой обработки данных, которая требуется вашему приложению. Событие Drop завершает операцию перетаскивания.

В следующем примере показан обработчик события Drop для элемента Ellipse. Этот код применяет эффекты операции перетаскивания и аналогичен коду в обработчике событий DragEnter. Он проверяет, содержит ли DataObject, перетаскиваемый по эллипсу, строковые данные, которые можно преобразовать в кисть. Если это так, кисть применяется к эллипсу. Если данные не могут быть преобразованы в кисть, никаких действий не выполняется.

Перетаскивание — это интуитивно понятный способ передачи данных внутри приложения или между приложениями на рабочем столе Windows. Перетаскивание позволяет пользователю передавать данные между приложениями или внутри приложения с помощью стандартного жеста (нажатие-удержание-и-панорамирование пальцем или нажатие-и-панорамирование-мышью или стилусом).

Источник перетаскивания, то есть приложение или область, в которой инициируется жест перетаскивания, предоставляет данные для переноса путем заполнения объекта пакета данных, который может содержать стандартные форматы данных, включая текст, RTF, HTML, растровые изображения, элементы хранения. или пользовательские форматы данных. Источник также указывает, какие операции он поддерживает: копирование, перемещение или связывание. Когда указатель отпускается, происходит падение. Цель перетаскивания, то есть приложение или область под указателем, обрабатывает пакет данных и возвращает тип выполненной операции.

Во время перетаскивания пользовательский интерфейс перетаскивания предоставляет визуальную индикацию типа выполняемой операции перетаскивания. Эта визуальная обратная связь изначально обеспечивается источником, но может изменяться целями по мере перемещения над ними указателя.

Современное перетаскивание доступно на всех устройствах, поддерживающих UWP. Он позволяет передавать данные между любыми приложениями или внутри них, включая классические приложения для Windows, хотя в этой статье основное внимание уделяется XAML API для современного перетаскивания. После реализации функция перетаскивания работает без проблем во всех направлениях, в том числе из приложения в приложение, из приложения на рабочий стол и из рабочего стола в приложение.

Вот краткий обзор того, что вам нужно сделать, чтобы включить перетаскивание в вашем приложении:

  1. Включите перетаскивание элемента, задав для его свойства CanDrag значение true.
  2. Создайте пакет данных. Система обрабатывает изображения и текст автоматически, но для другого контента вам потребуется обработать события DragStarted и DragCompleted и использовать их для создания собственного пакета данных.
  3. Включите перетаскивание, задав для свойства AllowDrop значение true для всех элементов, которые могут получать перетаскиваемый контент.
  4. Обработайте событие DragOver, чтобы сообщить системе, какой тип операций перетаскивания может выполнять элемент.
  5. Обработайте событие Drop, чтобы получить удаленный контент.

Включить перетаскивание

Чтобы разрешить перетаскивание элемента, установите для его свойства CanDrag значение true. Это позволяет перетаскивать элемент и содержащиеся в нем элементы в случае таких коллекций, как ListView.

Уточните, что можно перетаскивать. Пользователи не захотят перетаскивать все в вашем приложении, а только определенные элементы, например изображения или текст.

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

Создание пакета данных

В большинстве случаев система создаст для вас пакет данных. Система автоматически обрабатывает:

Для другого контента вам потребуется обработать события DragStarted и DragCompleted и использовать их для создания собственного DataPackage.

Включить удаление

В следующей разметке показано, как сделать определенную область приложения доступной для удаления с помощью AllowDrop в XAML. Если пользователь попытается перейти куда-то еще, система не позволит ему это сделать. Если вы хотите, чтобы пользователи могли перетаскивать элементы в любом месте вашего приложения, установите в качестве цели перетаскивания весь фон.

Обработка события DragOver

Событие DragOver возникает, когда пользователь перетаскивает элемент в ваше приложение, но еще не отпустил его. В этом обработчике вам нужно указать, какие операции поддерживает ваше приложение, используя свойство AcceptedOperation. Копирование является наиболее распространенным.

Обработка события Drop

Событие Drop происходит, когда пользователь отпускает элементы в допустимой области сброса. Обработайте их с помощью свойства DataView.

Для простоты в приведенном ниже примере мы предположим, что пользователь сбросил одну фотографию и обращается к ней напрямую. На самом деле пользователи могут одновременно удалять несколько элементов разных форматов. Ваше приложение должно обрабатывать эту возможность, проверяя, какие типы файлов были удалены и сколько их, и обрабатывать каждый соответствующим образом. Вам также следует уведомить пользователя, если он пытается сделать что-то, что не поддерживается вашим приложением.

Настроить пользовательский интерфейс

Система предоставляет пользовательский интерфейс по умолчанию для перетаскивания. Однако вы также можете настроить различные части пользовательского интерфейса, установив собственные подписи и глифы или вообще не отображая пользовательский интерфейс. Чтобы настроить пользовательский интерфейс, используйте свойство DragEventArgs.DragUIOverride.

Открыть контекстное меню элемента, который можно перетаскивать касанием

При использовании касания перетаскивание UIElement и открытие его контекстного меню используют схожие жесты касания; каждый начинается с нажатия и удержания. Вот как система устраняет неоднозначность между двумя действиями для элементов в вашем приложении, которые поддерживают оба:

  • Если пользователь нажимает и удерживает элемент и начинает его перетаскивать в течение 500 миллисекунд, элемент перетаскивается, а контекстное меню не отображается.
  • Если пользователь нажимает и удерживает, но не перетаскивает в течение 500 миллисекунд, открывается контекстное меню.
  • Если после открытия контекстного меню пользователь попытается перетащить элемент (не отрывая пальца), контекстное меню закроется и начнется перетаскивание.

Назначить элемент в ListView или GridView как папку

Вы можете указать ListViewItem или GridViewItem в качестве папки. Это особенно полезно для сценариев TreeView и File Explorer. Для этого явно установите для свойства AllowDrop значение True для этого элемента.

Система автоматически покажет соответствующую анимацию для перемещения в папку, а не для элемента, не входящего в папку. Код вашего приложения должен продолжать обрабатывать событие Drop для элемента папки (а также для элемента, не являющегося папкой), чтобы обновить источник данных и добавить удаленный элемент в целевую папку.

Включить изменение порядка перетаскивания в ListViews

ListViews поддерживает переупорядочение на основе перетаскивания по умолчанию, используя API, очень похожий на CanDrop API, описанный в этой статье. Как минимум, вы добавляете свойства AllowDrop и CanReorderItems.

Многие приложения позволяют пользователям передавать данные в другое приложение путем перетаскивания данных с помощью мыши или с помощью буфера обмена. Среди множества типов данных, которые можно передавать, есть объекты оболочки, такие как файлы или папки. Передача данных оболочки может происходить между двумя приложениями, но пользователи также могут передавать данные оболочки на рабочий стол или в проводник Windows или с них.

Хотя файлы являются наиболее часто передаваемым объектом Shell, передача данных Shell может включать в себя любые объекты из пространства имен Shell. Например, вашему приложению может потребоваться передать файл в виртуальную папку, такую ​​как корзина, или принять объект из расширения пространства имен, отличного от Microsoft. Если вы реализуете расширение пространства имен, оно должно корректно вести себя как источник и цель перетаскивания.

В этом документе обсуждается, как приложения могут реализовать перетаскивание и передачу данных из буфера обмена с объектами оболочки.

Как работает перетаскивание с объектами оболочки

  • Перетаскивание файла из проводника Windows или рабочего стола в приложение.
  • Копирование файла в буфер обмена проводника Windows и вставка его в приложение.
  • Перетаскивание файла из приложения в корзину.

Подробное обсуждение того, как обрабатывать эти и другие сценарии, см. в разделе Обработка сценариев передачи данных Shell. В этом документе основное внимание уделяется общим принципам передачи данных Shell.

Windows предоставляет приложениям два стандартных способа передачи данных Shell:

  • Пользователь вырезает или копирует данные Shell, например один или несколько файлов, в буфер обмена. Другое приложение извлекает данные из буфера обмена.
  • Пользователь перетаскивает значок, представляющий данные из исходного приложения, в окно, принадлежащее целевому.

В обоих случаях переданные данные содержатся в объекте данных. Объекты данных — это объекты модели компонентных объектов (COM), которые предоставляют интерфейс IDataObject. Схематично можно выделить три основных шага, которым должны следовать все передачи данных Shell:

  1. Источник создает объект данных, представляющий данные, которые необходимо передать.
  2. Цель получает указатель на интерфейс IDataObject объекта данных.
  3. Цель вызывает интерфейс IDataObject для извлечения из него данных.

Разница между передачей данных в буфер обмена и перетаскиванием заключается, прежде всего, в способе передачи указателя IDataObject из источника в цель.

Передача данных из буфера обмена

Буфер обмена — это самый простой способ передачи данных Shell. Основная процедура аналогична стандартной передаче данных буфера обмена. Однако, поскольку вы передаете указатель на объект данных, а не сами данные, вы должны использовать API буфера обмена OLE вместо стандартного API буфера обмена. В следующей процедуре показано, как использовать API буфера обмена OLE для передачи данных Shell с помощью буфера обмена:

  1. Источник данных создает объект данных для хранения данных.
  2. Источник данных вызывает OleSetClipboard, который помещает указатель на интерфейс IDataObject объекта данных в буфер обмена.
  3. Цель вызывает OleGetClipboard для получения указателя на интерфейс IDataObject объекта данных.
  4. Цель извлекает данные, вызывая метод IDataObject::GetData.
  5. При некоторых передачах данных Shell целевому объекту также может потребоваться вызвать метод IDataObject::SetData объекта данных, чтобы сообщить объекту данных о результатах передачи данных. Пример такого типа операции см. в разделе Обработка оптимизированных операций перемещения.

Перенос данных с помощью перетаскивания

Несмотря на то, что передача данных с помощью перетаскивания несколько сложнее в реализации, она имеет ряд существенных преимуществ по сравнению с буфером обмена:

  • Перемещение с помощью перетаскивания можно выполнять простым движением мыши, что делает операцию более гибкой и интуитивно понятной, чем использование буфера обмена.
  • Перетаскивание предоставляет пользователю визуальное представление операции. Пользователь может следить за значком, когда он перемещается от источника к целевому.
  • Перетаскивание уведомляет цель, когда данные доступны.

Операции перетаскивания также используют объекты данных для передачи данных. Однако источник перетаскивания должен предоставлять функциональные возможности помимо тех, которые требуются для передачи буфера обмена:

  • Источник перетаскивания также должен создать объект, предоставляющий интерфейс IDropSource. Система использует IDropSource для связи с источником во время выполнения операции.
  • Объект данных перетаскивания отвечает за отслеживание перемещения курсора и отображение значка, представляющего объект данных.

Цели перетаскивания также должны предоставлять больше функций, чем требуется для обработки передачи буфера обмена:

  • Цель перетаскивания должна предоставлять интерфейс IDropTarget.Когда курсор находится над целевым окном, система использует IDropTarget, чтобы предоставить целевому объекту такую ​​информацию, как положение курсора, и уведомить его об удалении данных.
  • Цель перетаскивания должна зарегистрироваться в системе, вызвав RegisterDragDrop. Эта функция предоставляет системе дескриптор целевого окна и указатель на интерфейс IDropTarget целевого приложения.

Для операций перетаскивания ваше приложение должно инициализировать COM с помощью OleInitialize, а не CoInitialize.

Следующая процедура описывает основные шаги, которые обычно используются для передачи данных Shell с помощью перетаскивания:

  1. Цель вызывает RegisterDragDrop, чтобы дать системе указатель на свой интерфейс IDropTarget и зарегистрировать окно в качестве цели перетаскивания.
  2. Когда пользователь запускает операцию перетаскивания, источник создает объект данных и инициирует цикл перетаскивания, вызывая DoDragDrop.
  3. Когда курсор находится над целевым окном, система уведомляет цель, вызывая один из методов цели IDropTarget. Система вызывает IDropTarget::DragEnter, когда курсор входит в целевое окно, и IDropTarget::DragOver, когда курсор проходит над целевым окном. Оба метода предоставляют цели перетаскивания текущую позицию курсора и состояние клавиш-модификаторов клавиатуры, таких как CTRL или ALT. Когда курсор покидает целевое окно, система уведомляет цель, вызывая IDropTarget::DragLeave. Когда любой из этих методов возвращает значение, система вызывает интерфейс IDropSource для передачи возвращаемого значения источнику.
  4. Когда пользователь отпускает кнопку мыши, чтобы удалить данные, система вызывает метод цели IDropTarget::Drop. Среди параметров метода есть указатель на интерфейс IDataObject объекта данных.
  5. Цель вызывает метод IDataObject::GetData объекта данных для извлечения данных.
  6. При некоторых передачах данных Shell целевому объекту также может потребоваться вызвать метод IDataObject::SetData объекта данных, чтобы сообщить источнику о результатах передачи данных.
  7. Когда цель завершает работу с объектом данных, она возвращается из IDropTarget::Drop. Система возвращает вызов DoDragDrop источника, чтобы уведомить источник о завершении передачи данных.
  8. В зависимости от конкретного сценария передачи данных источнику может потребоваться предпринять дополнительные действия на основе значения, возвращаемого функцией DoDragDrop, и значений, переданных объекту данных целью. Например, при перемещении файла источник должен проверить эти значения, чтобы определить, нужно ли удалять исходный файл.
  9. Источник освобождает объект данных.
  • Как источник создает объект данных, содержащий данные Shell.
  • Как цель извлекает данные Shell из объекта данных.
  • Как источник завершает операцию передачи данных.

Объект данных оболочки обеспечивает общее обсуждение того, как источник создает объект данных оболочки и как этот объект данных может обрабатываться целью. Обработка сценариев передачи данных Shell подробно обсуждает, как обрабатывать ряд распространенных сценариев передачи данных Shell.

Некоторая информация относится к предварительной версии продукта, которая может быть существенно изменена до ее выпуска. Microsoft не дает никаких явных или подразумеваемых гарантий в отношении представленной здесь информации.

Предоставляет вспомогательные методы и поля для запуска операций перетаскивания, включая метод начала операции перетаскивания, а также средства для добавления и удаления обработчиков событий, связанных с перетаскиванием.

Примечания

Перетаскивание обычно относится к методу передачи данных, который включает использование мыши (или другого указывающего устройства) для выбора одного или нескольких объектов и перетаскивания этих объектов на желаемую цель перетаскивания в пользовательском интерфейсе (UI). , и сбросив их. Операция перетаскивания аналогична операции копирования (или вырезания) и вставки, которая используется для переноса данных из одного объекта или приложения в другое. В операциях перетаскивания обычно участвуют две стороны: источник перетаскивания, из которого происходят перетаскиваемые данные, и цель перетаскивания, которая получает перетаскиваемые данные. События и методы, необходимые для операций перетаскивания, определяются в классе DragDrop. События перетаскивания — это прикрепленные события, которые можно прикрепить к любому UIElement или ContentElement. Источник перетаскивания и цель перетаскивания могут быть элементами пользовательского интерфейса в одном и том же приложении или в разных приложениях. Однако цель перетаскивания должна знать, как обрабатывать данные, передаваемые источником перетаскивания.

Классы UIElement и ContentElement содержат псевдонимы для событий перетаскивания, чтобы события отображались в списке членов класса, когда эти классы наследуются как базовый класс.Когда вы присоединяете обработчик события к событию перетаскивания в одном из этих классов, обработчик присоединяется к базовому событию DragDrop, и они получают один и тот же экземпляр данных события. Например, см. UIElement.Drop.

Источник перетаскивания инициирует операцию перетаскивания, вызывая статический метод DoDragDrop и передавая ему переданные данные. Элемент обычно обрабатывает следующие события, когда он является источником перетаскивания:

Элемент обычно обрабатывает следующие события, когда он является целью перетаскивания:

Читайте также: