为什么在VS2010下DragDrop无法工作?

6

我有一个使用UserControl的Winforms应用程序。用户控件的任务是从Windows资源管理器中收集用户拖放到它上面的文件,打开该文件并确定其类型并相应地处理。

在Visual Studio 2008 Pro下,此控件工作得非常完美。但是当我升级到VS 2010 Pro后,它就无法正常工作了。是否有某个标志或属性已更改,需要我注意?

我创建了一个快速演示以进行测试。在2008下,此演示可以完美运行,但在2010下根本无法工作。

设置步骤:创建新的Winform项目。添加用户控件。将以下代码设置在用户控件的代码部分中(编译以使用户控件出现在工具箱中)。将用户控件添加到表单中。运行程序,并将任何文件从Windows拖放到窗体上。如果它起作用,则用户控件区域应更改颜色。

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();

        this.AllowDrop = true;
        this.DragDrop += new DragEventHandler(UserControl1_DragDrop);
        this.DragEnter += new DragEventHandler(UserControl1_DragEnter);
        this.DragLeave += new EventHandler(UserControl1_DragLeave);
    }

    void UserControl1_DragLeave(object sender, EventArgs e)
    {
        this.BackColor = Color.FromName("Control");
    }

    void UserControl1_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop))
        {
            e.Effect = DragDropEffects.Copy;
            this.BackColor = Color.Blue;
        }
        else
        {
            e.Effect = DragDropEffects.None;
        }
    }

    void UserControl1_DragDrop(object sender, DragEventArgs e)
    {
        this.BackColor = Color.Yellow;
    }
}

我很乐意提供任何你们想到的解释或修复方法!
更新:
我已经尝试了下面列出的评论,但仍然无法正常工作。然而,我注意到它只在开发环境中失败。当我进入bin目录并手动启动程序时,它可以正常工作。但是在开发环境中它就不能正常工作,这让调试有些困难。我仍在寻找整体解决方案。

在我的VS 2010专业版中,它在悬停时从灰色变为蓝色,在拖放时变为黄色。(仅供参考)。 - KreepN
这就是它应该做的事情。非常奇怪!!!我想知道我的VS2010是否出了问题。其他所有功能都完美无缺。感谢您为我进行测试。您是否与上述设置有任何不同?是否启用了其他开关/标志/属性? - Jerry
我将代码原封不动地粘贴到一个用户控件中,然后添加到在 form_load 事件中的面板上,并进行了测试。没有修改任何属性。可能是因为你从工具箱中添加它导致其表现出异常行为。如我所述,我是以编程的方式添加的:UserControl1 uc1 = new UserControl1(); this.panel1.Controls.Add(uc1); - KreepN
1个回答

13

这里可能的失败原因是UIPI,即UAC的用户界面组件。您不能从非提升进程拖动并放置到由提升进程拥有的窗口中。 当您从已启用“以管理员身份运行此程序”选项的兼容性选项卡的快捷方式启动Visual Studio时,就会触发此错误。唯一的解决方法是关闭该选项。或者像您发现的那样,直接从.exe文件运行它。


天啊!就是这样。我不得不将它设置为“管理员”,因为我最近添加了另一个需要写入注册表的控件。非常感谢你。这真让我抓狂。 - Jerry
@Hans,你知道在以管理员权限运行的Visual Studio中启动具有标准权限的应用程序的方法吗? - d11
在Main()中使用Debugger.Launch(),这样你就可以从资源管理器启动程序,并在启动后附加调试器。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接