【问题标题】:Drag and drop onto a form (but not a WebBrowser control on the form)拖放到表单上(但不是表单上的 WebBrowser 控件)
【发布时间】:2010-12-15 21:28:46
【问题描述】:

我正在编写一个 Windows 窗体应用程序 (C#),它有一个 WebBrowser 控件(以及一些其他按钮和文本框)。我希望能够将文件放在表单上的任何位置。问题是默认情况下,WebBrowser 将尝试渲染任何放入其控件的文件;我不希望这样,因为我必须先对文件进行一些预处理。 WebBrowser 控件提供了一个名为 AllowWebBrowserDrop 的属性,我将其设置为 false 以禁用此行为。但是,结果是我无法在 WebBrowser 控件上放置任何内容(“不允许”反馈)。 WebBrowser 控件占据了大部分空间,所以如果你不得不将文件放在空闲空间的某个地方,那将是一种蹩脚的事情。如何在不让 WebBrowser 控件尝试呈现文件的情况下将文件拖放到表单上的任何位置?

我想我应该补充一点,我的表单上的 AllowDrop 设置为 true,并且有 DragEnter 和 DragDrop 的处理程序。我将 WebBrowser 上的 AllowWebBrowserDrop 设置为 false。其他一切都有默认设置。

【问题讨论】:

    标签: .net winforms drag-and-drop webbrowser-control


    【解决方案1】:

    根据您对WebBrowser 所做的操作,您可以处理Navigating 事件,该事件在浏览器导航之前触发。然后通过检查 URL 确定是否要处理丢弃。例如:

    private void browser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {
        if (e.Url.IsFile)
        {
            // Prevent navigation
            e.Cancel = true;
    
            // Fire your other OnDrop code
        }
    }
    

    为此,您需要将AllowWebBrowserDrop 设置为true

    如果这适用于您的业务案例,那就太好了;否则你可能会被困在直接处理窗口消息的过程中,如前所述,这并不好玩。

    【讨论】:

    • 这不是我想要的,但对我来说已经足够了。
    【解决方案2】:

    您能否添加一个透明背景色Panel,其 z 顺序高于其上方的 WebBrowser,并让 Panel 处理拖放?

    【讨论】:

    • imo,这可能适用于捕获 drop 事件,但也可能会破坏应用程序,因为 winforms 只会“伪造”透明背景。它也可能会排除其他重要事件。
    • 可能会覆盖 WndProc 并将 all 事件转发到底层的 WebBrowser,但 Drop 事件可以工作。
    猜你喜欢
    • 1970-01-01
    • 2020-11-26
    • 2010-09-19
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2012-08-23
    相关资源
    最近更新 更多