Перетягуйте файли в WPF


106

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

Відповіді:


211

Це в основному те, що ви хочете зробити.

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 (файли [0]);" to "foreach (строковий файл у файлах) {Openfile (file);}" - Спасибі :)
Eamonn McEvoy

1
Вибачте :) Я маю на увазі, що функція перетягування не працює. AllowDropвстановлено значення True, але Dropобробник події ніколи не викликається. Коли я перетягую файл через вікно, я бачу круговий символ "відмовлено"
mcont

4
Я використовував Gridяк кореневий елемент із Borderвнутрішньою частиною із Backgroundвластивістю, встановленою на щось (білий колір - це добре, але не прозоро). Всередині Borderя помістив фактичний вміст.
mcont

1
Налаштування фону на прозорий спрацювало мені добре, коли я намагався потрапити на сітку. Мабуть, вам потрібен фон, щоб трапився хіт-тест. Завдяки цій публікації в блозі: codeinreview.com/136/enabling-drag-and-drop-over-a-grid-in-wpf
DustinA

1
Одним із справжніх проблем є те, що якщо ви запускаєте VisualStudio як Admin - налагоджуйте свою програму - та перетягуєте з FileExplorer як не адміністратор, контекст безпеки відрізняється, і жодні події перетягування не запускаються. Коштувало мене 30 хвилин життя.
Ганс Карлсен

35

Файл зображення міститься в eпараметрі, який є екземпляром DragEventArgsкласу .
(Thesender Параметр містить посилання на об'єкт, який викликав подію.)

Зокрема, перевірити e.Dataчлен ; як пояснюється в документації, це повертає посилання на об'єкт даних ( IDataObject), який містить дані з події перетягування.

The IDataObjectІнтерфейс надає ряд методів для отримання об'єкта даних , який ви після цього . Ви, ймовірно, захочете почати з виклику GetFormatsметоду , щоб дізнатися формат даних, з якими ви працюєте. (Наприклад, це фактичне зображення чи просто шлях до файлу зображення?)

Потім, визначивши формат затягнутого файлу, ви зателефонуєте до однієї з певних перевантажень GetDataметоду, щоб фактично отримати об'єкт даних у певному форматі.


12

Крім того, щоб відповісти на AR, зауважте, що якщо ви хочете скористатися, TextBoxвам потрібно знати наступні речі.

TextBoxЗдається, вже є деяка обробка за замовчуванням для DragAndDrop. Якщо вашим об’єктом даних є String, він просто працює. Інші типи не обробляються, і ви отримуєте ефект Забороненої миші, і ваш обробник 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.