Использование Drag&Drop в WPF

Сегодня уже весьма сложно представить себе программу, которая не поддерживает перетаскивание мышью (Drag&Drop) в той или иной форме. Рассмотрим реализацию этого механизма в WPF.

В качестве примера используем два элемента управления Image и реализуем перетаскивание изображения из одного элемента в другой.

В начале необходимо активировать механизм Drag&Drop в элементе, который является источником.

Сделать это можно при помощи события MouseMove. В нём мы проверяем удерживается ли при перемещении мыши в нажатом состоянии её левая кнопка, создаём объект передачи данных и собственно инициируем операцию перетаскивания.

private void image1_MouseMove(object sender, MouseEventArgs e)
{
    base.OnMouseMove(e);
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        DataObject data = new DataObject(typeof(ImageSource), image1.Source);
        DragDrop.DoDragDrop(this, data, DragDropEffects.Copy | DragDropEffects.Move);
    }
}

В конструктор объекта передачи данных мы передаём имя типа передаваемых данных (первый параметр) и сами данные (второй параметр).

В метод DoDragDrop мы передаём объект, который является источником данных для перетаскивания, ранее созданный объект передачи данных и перечень разрешённых действий для Drag&Drop. В нашем случае при перетаскивании разрешается копирование и перемещение данных.

Теперь, после того как перетаскивание инициировано, данные необходимо принять в нужном элементе управления.

Приём данных при Drag&Drop управляется атрибутом AllowDrop. Если он имеет значение true, на элемент управления можно перетаскивать желаемые данные.

Ниже приведена разметка для второго элемента управления Image со включённым приёмом данных при перетаскивании и подпиской на событие Drop.

<Image x:Name="image2" HorizontalAlignment="Left" Height="117" Margin="261,178,0,0" VerticalAlignment="Top" Width="155" AllowDrop="True" Drop="image2_Drop" Source="test.jpg"/>

Событие Drop отвечает за обработку данных, которые были приняты в результате перетаскивания.

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

private void image2_Drop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(ImageSource)))
    {
        image2.Source = e.Data.GetData(typeof(ImageSource)) as ImageSource;
    }
}

К сожалению, при использовании Drag&Drop данные поступают в виде Object. Поэтому требуется указание типа с последующим приведением.

Особенности загрузки файлов при помощи Drag&Drop

При загрузке файлов (например из Проводника Windows) нет необходимости инициировать процесс переноса. Это делает файловый менеджер.

Для приёма файлов предусмотрен специальный формат FileDrop, который по существу представляет собой массив строк, которые содержат путь к отдельному файлу.

Ниже представлен пример загрузки изображения из файла в Image.

Добавить комментарий

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