Перетаскивание не работает в приложении С# Winforms

Я пытаюсь создать форму окна, на которую я могу удалить файл/папку.

У меня есть следующий код в приложении WinForms

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_DragEnter(object sender, DragEventArgs e)
    {
        Debug.Print("DragEnter");
    }

    private void Form1_DragDrop(object sender, DragEventArgs e)
    {
        MessageBox.Show("Dropped!");
    }
}

Я установил для свойства AllowDrop значение true. Я попытался запустить приложение в отладке в Visual Studio. Основываясь на ответах на другие подобные вопросы, я попытался запустить скомпилированный exe в качестве администратора. Я пытался запустить скомпилированный exe не как администратор.

Но что бы я ни делал, я не могу запустить событие DragDrop. Однако событие DragEnter срабатывает. Что мне не хватает?

Ответ 1

Соответствует ли ваш DragDropEffect? Попробуйте поместить это в метод обработчика событий DragEnter:

    private void Form1_DragEnter(object sender, DragEventArgs e)
    {
        Console.WriteLine("DragEnter!");
        e.Effect = DragDropEffects.Copy;
    }

По умолчанию установлено значение DragDropEffects.None, поэтому событие Drop не будет срабатывать.

Ответ 2

Для тех, кто будет читать это, потому что советы выше не работают.

Обратите внимание, что перетаскивание не будет работать, если вы запустите Visual Studio или ваше приложение "Как администратор", как указано здесь: https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/2164233-fix-drag-and-drop-to-open-file-when-running-as-adm

Ответ 3

попробуйте использовать что-то вроде этого в Form1_DragEnter:

private void Form1_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
        e.Effect = DragDropEffects.All;
    else
    {
        String[] strGetFormats = e.Data.GetFormats();
        e.Effect = DragDropEffects.None;
    }
}

это запустит ваш Form1_DragDrop

Ответ 4

Не забудьте в свойствах формы изменить AllowDrop на "True". Ваш код, вероятно, прав, но если это свойство не включено в true, это не сработает. По умолчанию установлено значение false.

Ответ 5

Вы пишете события MouseDown и MouseMove объекта, из которого вы перетаскиваете.

Ответ 6

Другая очень неприятная и сложная проблема может заключаться в том, что вы переопределили OnHandleCreated, но забыли назвать базовую реализацию. Затем ваше приложение не сможет установить необходимые внутренние параметры окна, чтобы уважать ваше свойство AllowDrop.

Например, убедитесь, что вы вызываете base.OnHandleCreated(e) в своем переопределении, и все будет в порядке.

Ответ 7

У меня также была эта запутанная проблема, несмотря на то, что для параметра AllowDrop установлено значение true!

В моем приложении Windows Forms (VS2017) мне пришлось убедиться, что я установил действительный объект запуска: например, myprojectname.Program и все было в порядке!

Ответ 8

У меня была указана командная строка, указывающая на файл, которого больше не существует. Каким-то образом это мешало перетаскиванию войти. Как только я удалил его, все снова было хорошо.