Перетащите файлы в 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>

отлично работает, просто заменил "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, что очень важно для объединения всего этого. Престижность.
Грег Фогель
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.