Перетащите файлы в WPF

107

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

private void ImagePanel_Drop(object sender, DragEventArgs e)
{
    //what next, dont know how to get the image object, can I get the file path here?
}
Имонн МакЭвой
источник

Ответы:

212

Это в основном то, чем вы хотите заниматься.

private void ImagePanel_Drop(object sender, DragEventArgs e)
{

  if (e.Data.GetDataPresent(DataFormats.FileDrop))
  {
    // Note that you can have more than one file.
    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

    // Assuming you have one file that you care about, pass it off to whatever
    // handling code you have defined.
    HandleFileOpen(files[0]);
  }
}

Также не забудьте подключить событие в XAML, а также установить AllowDropатрибут.

<StackPanel Name="ImagePanel" Drop="ImagePanel_Drop" AllowDrop="true">
    ...
</StackPanel>
AR
источник
отлично работает, просто заменил "HandleFileOpen (files [0]);" to "foreach (строковый файл в файлах) {Openfile (file);}" - Спасибо :)
Имонн МакЭвой,
1
Извините :) Я имею в виду, что перетаскивание не работает. AllowDropустановлено значение True, но Dropобработчик событий никогда не вызывается. Когда я перетаскиваю файл в окно, я вижу круговой символ
отказа
4
Я использовал в Gridкачестве корневого элемента с Borderвнутренним элементом со Backgroundсвойством, установленным на что-то (белый - это нормально, но не прозрачный). Внутри Borderя поместил фактическое содержимое.
mcont
1
Установка прозрачного фона отлично работала для меня при попытке перейти на сетку. По-видимому, вам нужен фон, чтобы выполнить проверку попадания. Благодаря этой записи в блоге: codeinreview.com/136/enpting-drag-and-drop-over-a-grid-in-wpf
DustinA
1
Одна настоящая проблема заключается в том, что если вы запустите VisualStudio от имени администратора - отлаживаете приложение - и перетаскиваете из FileExplorer как не администратор, контекст безопасности будет другим, и события перетаскивания не будут запускаться. Мне стоили 30 минут жизни.
Ханс Карлсен,
35

Файл изображения содержится в eпараметре, который является экземпляром DragEventArgsкласса .
( senderПараметр содержит ссылку на объект, вызвавший событие.)

В частности, проверьте e.Dataчлен ; как поясняется в документации, это возвращает ссылку на объект данных ( IDataObject), который содержит данные из события перетаскивания.

IDataObjectИнтерфейс предоставляет ряд методов для получения объекта данных , который вы после этого . Вероятно, вы захотите начать с вызова GetFormatsметода , чтобы узнать формат данных, с которыми вы работаете. (Например, это реальное изображение или просто путь к файлу изображения?)

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

Коди Грей
источник
12

В дополнение к ответу AR обратите внимание, что если вы хотите использовать TextBoxdrop, вы должны знать следующие вещи.

TextBoxпохоже, уже есть некоторая обработка по умолчанию для DragAndDrop. Если ваш объект данных - Stringэто просто работает. Другие типы не обрабатываются, и вы получаете эффект Forbidden mouse, и ваш обработчик Drop никогда не вызывается.

Похоже , вы можете включить свое собственное обращение с e.Handledк истинному в PreviewDragOverобработчик событий.

XAML

<TextBox AllowDrop="True"    x:Name="RtbInputFile"      HorizontalAlignment="Stretch"   HorizontalScrollBarVisibility="Visible"  VerticalScrollBarVisibility="Visible" />

C #

RtbInputFile.Drop += RtbInputFile_Drop;            
RtbInputFile.PreviewDragOver += RtbInputFile_PreviewDragOver;

private void RtbInputFile_PreviewDragOver(object sender, DragEventArgs e)
{
    e.Handled = true;
}

private void RtbInputFile_Drop(object sender, DragEventArgs e)
{
     if (e.Data.GetDataPresent(DataFormats.FileDrop))
     {
                // Note that you can have more than one file.
                string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
                var file = files[0];                
                HandleFile(file);  
     }
}
Разработчик
источник
1
В примере AR отсутствует обработчик PreviewDragOver, что очень важно для объединения всего этого. Престижность.
Грег Фогель