Winforms 实现Web浏览器控件WinC窗体的拖放功能#

Winforms 实现Web浏览器控件WinC窗体的拖放功能#,winforms,drag-and-drop,webbrowser-control,Winforms,Drag And Drop,Webbrowser Control,我需要在WinForm C#中捕获WebBrowser控件的拖放事件。有什么办法吗?标准的拖放方式不起作用吗 如果要控制WebBrowser控件在拖放操作期间的操作,还可以查看IDocHostUIHandler::GetDropTarget 连接IDocHostUIHandler实现的最简单方法是连接ICustomDoc接口及其所有SetUIHandler方法(请参阅)。不过。另一种方法是跳过Windows窗体的webbrowser类和。我的解决方法: 使用布尔成员变量来检测是从内部代码调用n

我需要在WinForm C#中捕获WebBrowser控件的拖放事件。有什么办法吗?

标准的拖放方式不起作用吗

如果要控制WebBrowser控件在拖放操作期间的操作,还可以查看IDocHostUIHandler::GetDropTarget

连接IDocHostUIHandler实现的最简单方法是连接ICustomDoc接口及其所有SetUIHandler方法(请参阅)。不过。另一种方法是跳过Windows窗体的webbrowser类和。

我的解决方法:

使用布尔成员变量来检测是从内部代码调用navigate,还是从外部代码调用Navigation。实现“导航”(BeforeNavigating)事件并检查它是否是来自外部的调用

例如:

呼叫从内部导航:

    private void NavigateLocal(string htmlFileName)
    {
        this.localNavigate = true;
        this.webBrowser.Navigate(htmlFileName);
    }
事件方法:

    private void WebBrowser_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {
        if (this.localNavigate)//inside call
        {
            this.localNavigate = false;
        }
        else //call from outside
        {

            this.DoDragDrop(e.Url.ToString());
        }
    }
我使用的“修复”是让浏览器告诉你它正在被拖动,用屏幕截图弹出一张图片,然后处理正常的c#事件

在html文件中

var holder = document.getElementsByTagName('body')[0];
holder.ondragover = function () {
    window.external.DragStarted(event);
    return true; 
};

不要忘了在DragLeave/DragDrop之后隐藏picturebox,我发现最好的方法是通过主机处理控件中的
导航
事件。当您将文件放到控件上时,将触发此事件,您可以在此时提取文件名。诀窍是,你必须知道什么构成了合法的导航(即直接导航的文档与删除的文件)。大多数处理drop事件的应用程序都使用一个特定的文档或一组已知文档,这不应该是一个问题

另一个选项是使用JavaScript代码通过HTML文档内部的
window.ondrop
处理拖放操作,但您只能获取文件数据和文件名,而不能获取完整路径

有关这两种方法的更多信息,请参阅以下博文:

C#中的WinForm不支持WebBrowser控件的拖放功能。您需要编写自己的类来处理它。WPF确实为WebBrowser控件提供了拖放功能。很抱歉,我的错,winform中无法使用事件对象。
var holder = document.getElementsByTagName('body')[0];
holder.ondragover = function () {
    window.external.DragStarted(event);
    return true; 
};