Обнаружить файл Drag'n'Drop в WPF? - PullRequest
13 голосов
/ 02 декабря 2008

Возможно ли, чтобы окно / элемент WPF обнаруживало перетаскивание файла из проводника Windows в C # .Net 3.5? Я нашел решения для WinForms, но ни одного для WPF.

Ответы [ 5 ]

7 голосов
/ 22 апреля 2011

Попробуйте следующее:

    private void MessageTextBox_Drop(object sender, DragEventArgs e)
    {
        if (e.Data is DataObject && ((DataObject)e.Data).ContainsFileDropList())
        {
            foreach (string filePath in ((DataObject)e.Data).GetFileDropList())
            {
                // Processing here     
            }
        }
    }


    private void MessageTextBox_PreviewDragEnter(object sender, DragEventArgs e)
    {
        var dropPossible = e.Data != null && ((DataObject)e.Data).ContainsFileDropList();
        if (dropPossible)
        {
            e.Effects = DragDropEffects.Copy;
        }
    }

    private void MessageTextBox_PreviewDragOver(object sender, DragEventArgs e)
    {
        e.Handled = true;
    }
5 голосов
/ 03 декабря 2008

К сожалению, средства просмотра TextBox, RichTextBox и FlowDocument всегда помечают события перетаскивания как обработанные, что предотвращает их появление в ваших обработчиках. Вы можете восстановить события перетаскивания, перехваченные этими элементами управления, принудительно обработав события перетаскивания (используйте UIElement.AddHandler и установите для handledEventsToo значение true) и задав для e.Handled значение false в своем обработчике.

3 голосов
/ 06 февраля 2009

Я заметил, что перетаскивание в WPF не так просто, как могло бы быть. Поэтому я написал небольшую статью на эту тему: http://www.wpftutorial.net/DragAndDrop.html

3 голосов
/ 02 декабря 2008

Оказывается, по какой-то причине я не смог заскочить на свой TextBox, но перетаскивание на кнопки работает нормально. Получилось, добавив 'AllowDrop = "True"' к моему окну и добавив обработчик события отбрасывания к кнопке, состоящей из:

private void btnFindType_Drop(object sender, DragEventArgs e)
{
  if (e.Data is System.Windows.DataObject &&
    ((System.Windows.DataObject)e.Data).ContainsFileDropList())
  {
    foreach (string filePath in ((System.Windows.DataObject)e.Data).GetFileDropList())
    {
      // Processing here
    }
  }            
}
0 голосов
/ 22 марта 2012

У меня была похожая проблема, события перетаскивания и события перетаскивания не запускались. Проблема была с настройками учетной записи пользователя Windows. Установите для этого параметра наименее безопасный режим и попробуйте тот же код, который работает.

...