Перетащите файлы в WPF - PullRequest
92 голосов
/ 14 апреля 2011

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

Ответы [ 3 ]

180 голосов
/ 14 апреля 2011

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

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>
35 голосов
/ 14 апреля 2011

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

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

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

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

9 голосов
/ 24 мая 2016

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

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

Похоже, вы можете включить свою собственную обработку с e.Handled до true в обработчике 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);  
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...