Перетаскивание файлов в WPF

Мне нужно отбросить файл изображения в мое приложение 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?
}

Ответ 1

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

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>

Ответ 2

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

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

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

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

Ответ 3

Дополнительно к ответу А.Р. обратите внимание, что если вы хотите использовать TextBox, вы должны знать следующее.

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

Кажется, вы можете включить собственную обработку с e.Handled до true в обработчике событий PreviewDragOver.

XAML

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

С#

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);  
     }
}