Patrick Skelton Ответов: 1

Как перетащить файл из произвольного источника в мое приложение WPF?


У меня есть приложение WPF, которое имеет мини-файловый проводник. Я хочу иметь возможность перетаскивать файлы из различных источников (возможно, Проводник или вложение электронной почты в почтовую программу) и помещать их на свой элемент управления file-explorer. Тип файла не имеет значения, потому что семантика операции всегда одна и та же: скопируйте файл в текущий каталог, отображаемый моим элементом управления mini-file-explorer.

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

Любая помощь будет очень признательна.

Что я уже пробовал:

Я пробовал устанавливать Drop="True" на моем целевом контроле и предоставлении обработчика для Drop событие, но элемент управления просто отображает значок без входа, когда я перетаскиваю на него файл, и событие не срабатывает.

1 Ответов

Рейтинг:
2

Richard Deeming

Вам нужно будет справиться с Без dragdrop.Прикрепленное событие DragOver[^] и установить Effects недвижимость на DragEventArgs параметр к соответствующему значению на основе доступных форматов данных.

private void control_DragOver(object sender, DragEventArgs e)
{
    e.Effects = DragDropEffects.None;

    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        e.Effects = DragDropEffects.Copy;
    }
}

private void control_Drop(object sender, DragEventArgs e)
{
    string[] droppedFiles = e.Data.GetData(DataFormats.FileDrop) as string[];
    if (droppedFiles != null && droppedFiles.Length != 0)
    {
        ...
    }
}

Обзор перетаскивания[^]

Я не использовал его, но я только что нашел эта библиотека перетаскивания WPF[^], что выглядит многообещающе.


Patrick Skelton

Спасибо за информацию. В ближайшее время я бы этого не понял.

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

Richard Deeming

Делает ли это DragOver обработчик событий получил удар? Если да, то делает ли это GetDataPresent призыв вернуться true?

Patrick Skelton

Нет. Я добавил обработчики событий для DragOver и PreviewDragOver как в элемент управления, так и в содержащее его окно. Ни один из них не пострадал.

Мне придется поиграть с библиотекой выше, чтобы попытаться понять, что она делает, чего я не делаю. Я бы просто использовал его, но это кажется излишним для моего простого требования.

Richard Deeming

И вы определенно настроились AllowDrop[^] к true?

Patrick Skelton

Да, опять же как на элементе управления, так и на содержащем его окне.

Richard Deeming

Странный. Я только что попробовал очень простой пример в LINQPad, и он отлично работает.

Вы используете нестандартный домен приложения? Существовала проблема, из-за которой окно не регистрировалось как цель Ole drop, и для ее решения требовалось некоторое отражение:
http://blog.functionalfun.net/2009/10/work-around-for-wpf-bug-drag-and-drop.html[^]

Patrick Skelton

Ах, ваш комментарий о AppDomains заставил меня задуматься. Оказывается, все дело в том, что я запускал его в отладчике. Я мог бы пнуть себя за то, что не попробовал сделать это с помощью простого двойного щелчка по файлу .exe.

Большое вам спасибо за вашу помощь.