6

注意:这是关于控件的内置行为,而不是关于创建双击事件。

我的一个项目使用 Windows.Forms.WebBrowser 控件作为 HTML 的编辑器和查看器。它多年来一直运行良好,但突然我注意到,在我双击之前,它会自动选择被点击的单词(这不是我的代码,只是发生在控件上)。

突然(不确定何时),双击控件中的文本(无论是在编辑模式下还是在查看模式下)什么都不做。很难排除故障,因为这不是我的代码在做的,但是,由于我过去依赖此功能,现在它正在影响我的最终产品。

知道最近会发生什么变化(在 Windows 或 .Net 中)会影响这一点(我的应用程序的相同版本在较旧的 Win7 中运行良好,但在最新的 Win7 中运行良好)?另外,我怎样才能恢复以前的功能?我必须连线自己双击 DOM,然后开始解析文本以手动选择它(嗯!)?

我已经到处寻找这个问题的答案,但大多数时候我只是看到如何连接到 DOM 事件,没有关于最近会导致上述问题的更改)。任何帮助将不胜感激。

当问题发生时,我正在使用 VS 2010、VB、Win7 x64、IE 10.0.6、.Net 3.5(无论最新的是什么)(已编译,所以我怀疑它是 VS 还是 VB)。

当我在带有 IE 8(Win7 Pro 普通版,安装了零更新)的 Win7 x86 上运行完全相同的代码(编译)时,它工作得很好。

经过一些进一步的测试,在 Win7 x86 全新安装(一切都很好)上,一旦我安装了 IE 10 而没有其他问题,问题就开始发生了。所以,我很确定问题出在 IE 10 上。

重现步骤:

  1. 在 VS 2010 中创建一个新的 VB.Net 项目,目标是 .Net 3.5
  2. 创建用户控件<---这一步是关键
  3. 将网络浏览器添加到用户控件
  4. 将此代码添加到用户控件

    Public Sub LoadHTML(html As String)
        WebBrowser1.DocumentText = html
    
        Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
            Application.DoEvents()
        Loop
    
        WebBrowser1.Document.Body.SetAttribute("contentEditable", "false")
    End Sub
    
  5. 将该控件添加到窗体

  6. 使用以下按钮向表单添加一个按钮。单击事件:

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        UserControl1.LoadHTML("<html><body>This is a test interesting is it not?</body></html>")
    End Sub
    
  7. 运行项目并单击按钮

  8. 然后,尝试双击单词“interesting”并注意它没有被选中。

如果您将 webbrowser 控件直接放在表单上,​​它将正常工作。问题出在用户控件上(只有更新到 IE10 后才有问题)。

我可以使用 .Net 3.5 和 4.0 使用 VS 2010 重现该问题。我可以使用 .Net 4.5 使用 VS 2012 重现该问题。

4

8 回答 8

3

这个问题实际上是 IE 10 中的一个错误。微软在此处确认了这一点。

最可悲的是,他们说他们不会很快(如果有的话)修复它,因为它影响的人太少(尽管它确实影响了我公司的数千名客户)。

于 2013-08-03T04:04:35.537 回答
3

虽然这已被报告为 IE10 中的一个已知问题(我所看到的报告该错误的链接都没有仍然有效),但它尚未在任何更新的版本中得到修复(因此我们在最终迁移时遇到了这个问题从 WinXP/IE8 到 Win10/IE11)。

有趣的是,我发现的最佳解决方法来自@John 在中国DataZX论坛上发布的相同问题。

基本上,当控件的某些属性从UserControlSystem.Windows.Forms.WebBrowser中的设计器设置到方法中时,就会出现问题。将这些属性分配移到初始化过程的后期,例如:到事件处理程序中,解决了问题并恢复了控件的双击(+三次)单击行为。UserControl.Designer.InitializeComponent()UserControl.Load

导致此问题的已知属性包括(但其他也可能导致此或类似问题)

  • ScriptErrorsSuppressed
  • AllowWebBrowserDrop

因此,如果在设计器中设置了这些属性中的任何一个,请将它们移动到 Load 事件处理程序,双击现在应该可以按预期工作。

例如(来自 UserControl.designer.vb 的问题代码)

Private Sub InitializeComponent()
    Me.WebBrowser1 = New System.Windows.Forms.WebBrowser()
    Me.SuspendLayout()
    '
    'WebBrowser1
    '
    Me.WebBrowser1.AllowWebBrowserDrop = False 'This line will cause the problem
    Me.WebBrowser1.Location = New System.Drawing.Point(20, 3)
    Me.WebBrowser1.MinimumSize = New System.Drawing.Size(20, 20)
    Me.WebBrowser1.Name = "WebBrowser1"
    Me.WebBrowser1.ScriptErrorsSuppressed = True  'This line will ALSO cause the problem
    Me.WebBrowser1.Size = New System.Drawing.Size(147, 138)
    Me.WebBrowser1.TabIndex = 0
End Sub

注释掉上面导致问题的行,并用以下内容替换UserControl.vb

Private Sub UserControl_Load(sender As Object, e As EventArgs) Handles Me.Load
    'Setting these properties here does not cause any problems
    Me.WebBrowser1.AllowWebBrowserDrop = True 
    Me.WebBrowser1.ScriptErrorsSuppressed = False
    Me.WebBrowser1.DocumentText = "These are test words that you can attempt to double click"
End Sub
于 2015-09-28T01:06:30.823 回答
1

我知道这是不久前被问到的,但是当我创建 HTML 编辑器控件并安装 IE 10 时,我也遇到了同样的问题。

以下是我在 C#.Net 中解决此问题的方法:

// Add this to your Web Browsers ProgressChanged event
private void web_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
{
    // Detach the event handler before attaching
    web.Document.DetachEventHandler("ondblclick", Document_DoubleClick);

    // Now attach the event handler
    web.Document.AttachEventHandler("ondblclick", Document_DoubleClick);
}

// Add this to your project
private void Document_DoubleClick(object sender, EventArgs e)
{
    IHTMLSelectionObject sel = doc.selection as IHTMLSelectionObject;
    IHTMLTxtRange rng = sel.createRange() as IHTMLTxtRange;
    rng.expand("word");
    rng.select();
}

现在双击将突出显示鼠标下的单词。

于 2014-08-20T08:46:54.273 回答
0

WebBrowser 控件不能很好地与其他控件配合使用,它需要封装(包含在)一个 Panel 中,与其他表单控件隔离。

我在选项卡控件中使用 WebBrowser 控件并且遇到了同样的问题。在选项卡中添加面板然后将 WebBrowser 放置在面板中时,问题就消失了。

于 2014-07-20T00:54:43.980 回答
0

我知道现在提供解决方案可能为时已晚,但我最终修改和重写了一些我偶然发现的 JavaScript 代码并最终完成了这个,希望这可能对您有用。

如果有人仍然遇到此问题,这应该会有所帮助。

它是一个跨浏览器的实现,因为我使用了一些针对不同浏览器的其他库,但如果你只想要 IE,应该很容易删除不必要的代码。

如果您确实尝试实现这一点,我建议您将其缩小并在您的应用程序资源中创建一个 js 文件,然后在注入中引用它。

 Dim headElement As HtmlElement = browser.Document.GetElementsByTagName("head")(0)
        Dim scriptElement As HtmlElement = browser.Document.CreateElement("script")
        Dim element As IHTMLScriptElement = DirectCast(scriptElement.DomElement, IHTMLScriptElement)
        element.text = My.Resources.select_text_ie
        headElement.AppendChild(scriptElement)

这应该在 DocumentCompleted 事件中注入。

于 2017-03-16T16:17:13.873 回答
0

环境:VS2017 C#,.net framework 4.6,Win10。IE11 已安装。没有对注册表中的 FEATURE_BROWSER_EMULATION 进行任何操作。

将面板拖放到窗体上,然后将 WebBrowser 控件放在面板上。双击任何元素都不会选择html 页面上的文本。

如果您不使用面板并将 WebBrowser 直接放在表单上,​​它可以正常工作。如果您需要将它与面板一起使用怎么办?

创建一个带有 WebBrowser 的简单用户控件,并公开 WebBrowser 所需的事件和属性。将此用户控件放在任何面板上,然后双击选择文本将按应有的方式工作。

于 2018-09-16T12:42:59.633 回答
0

我迟到了,但其他人可能仍在寻求帮助。我有这个HtmlEditorControl,我希望 DoubleClick 在 Windows 10 上工作。在您的 WebBrowser.DocumentCompleted 方法中添加以下代码:

this.editorWebBrowser.Document.AttachEventHandler("ondblclick", (_object, _event) =>
        {
            //First check if the user has selected something, if not, move the current selection starting from the current location of the text cursor.
            if (string.IsNullOrEmpty(SelectedText.Trim()))
            {
                //All objects bellow are referenced, there is no need to assign them to the HtmlEditorControl again
                // define the selected range object
                mshtml.IHTMLSelectionObject selection;
                mshtml.IHTMLTxtRangerange = null;
                try
                {
                    // calculate the text range based on user selection
                    selection = _mshtmlDocument.selection;

                    if (selection.type.ToLower().Equals("text") || selection.type.ToLower().Equals("none"))
                    {
                        range = (mshtml.IHTMLTxtRange)selection.createRange();
                    }
                }
                catch (Exception)
                {
                    // have unknown error so set return to null
                    range = null;
                    return;
                }

                if (range == null)
                {
                    //error!!
                    return;
                }

                //Move the current selection one word back
                range.moveStart("word", -1);
                range.moveEnd("word", 1);
                range.select();
                if (range.text == null)
                {
                    //error!!
                    return;
                }
            }
        });
于 2016-05-18T16:36:57.300 回答
-2

<!DOCTYPE html>在文件开头插入

于 2013-07-18T08:32:07.963 回答