拖放在C# Winforms应用程序中不起作用

rekjcdws  于 2023-06-06  发布在  C#
关注(0)|答案(9)|浏览(442)

我正在尝试创建一个windows窗体,可以将文件/文件夹拖放到该窗体上。
我在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中的debug中运行应用程序。基于对其他类似问题的回答,我尝试以管理员身份运行编译后的exe。我试着以管理员身份运行编译后的exe not
但是无论我做什么,我都无法触发DragDrop事件。然而,DragEnter事件 * 确实 * 触发。我错过了什么?

k2arahey

k2arahey1#

您的DragDropEffect设置正确吗?尝试将其放置在DragEnter事件处理程序方法中:

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

默认情况下,它被设置为DragDropEffects.None,因此不会触发Drop事件。

svujldwt

svujldwt2#

对于那些谁会读这篇文章,因为上面的提示不起作用。
请注意,如果您以“管理员身份”运行Visual Studio或您的应用,则拖放将无法工作,如下所述:https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/2164233-fix-drag-and-drop-to-open-file-when-running-as-adm

ny6fqffe

ny6fqffe3#

不要忘记在表单的属性中将AllowDrop更改为“True”您的代码可能没有问题,但如果此属性未启用为true,则无法工作。默认设置为false。

7eumitmz

7eumitmz4#

尝试在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

xurqigkl

xurqigkl5#

是否已编写拖动对象的MouseDown和MouseMove事件。

iecba09b

iecba09b6#

另一个非常讨厌和棘手的问题可能是,您已经覆盖了OnHandleCreated,但忘记了调用基本实现。那么您的应用程序无法设置所需的内部窗口设置来尊重您的AllowDrop属性。
例如,确保在覆盖中调用base.OnHandleCreated(e),这样就可以了。

ufj5ltwl

ufj5ltwl7#

我也有这个令人困惑的问题,尽管形式有AllowDrop设置为真!
在我的Windows窗体应用程序(VS 2017)中,我必须确保设置了有效的Startup对象:例如myprojectname.程序和一切都很好!

2jcobegt

2jcobegt8#

我指定了一个命令行,它指向一个不再存在的文件。不知何故,这是阻止阻力进入射击。一旦我把它取下来,一切都好了。

fykwrbwg

fykwrbwg9#

可能是一个罕见的场景,但也许有一天会对某人有所帮助:
以上都不适合我。我在Form_DragDrop中的断点从未被击中。
结果是,处理程序函数中的代码调用了另一个DLL的静态函数,但加载失败(BadImageException)。此错误被默默忽略,整个事件处理程序只是没有被调用。

相关问题