安装IE 10后,WebBrowser控件不会在双击时自动选择文本

时间:2013-07-06 04:29:04

标签: .net winforms webbrowser-control

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

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

突然(不完全确定何时),双击控件中的文本(在编辑模式或视图模式下)都不执行任何操作。很难排除故障,因为这不是我的代码,但是,因为我过去依赖于这个功能,现在它正在影响我的最终产品。

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

我一直在寻找这个问题的答案,但主要是我只看到如何连接到DOM事件,没有关于最近会导致上述问题的变化。任何帮助将不胜感激。

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

当我在Win7 x86上使用IE 8(Win7 Pro plain,安装了零更新)运行完全相同的代码(已编译)时,它可以正常工作。

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

重现的步骤:

  1. 在VS 2010中创建一个新的VB.Net项目,目标是.Net 3.5
  2. 创建一个usercontrol< ---这一步是关键
  3. 将webbrowser添加到usercontrol
  4. 将此代码添加到usercontrol

    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. 然后,尝试双击“有趣”一词,注意它没有选择。
  9. 如果直接在表单上抛出webbrowser控件,它将正常工作。问题出在usercontrol上(更新到IE10后只是一个问题)。

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

8 个答案:

答案 0 :(得分:3)

问题实际上是IE 10中的一个错误。这已得到Microsoft here的确认。

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

答案 1 :(得分:3)

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

有趣的是,我发现的最好的工作是@ John在中国DataZX论坛上发布同样的问题。

基本上问题出现在System.Windows.Forms.WebBrowser控件的某些属性是从UserControl 中的设计器设置进入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

答案 2 :(得分: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();
}

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

答案 3 :(得分:0)

WebBrowser控件与其他控件不兼容,它需要封装(包含在)Panel中,与其他表单控件隔离。

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

答案 4 :(得分:0)

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

Sub LoopSelection()

    Dim cel As Range
    Dim selectedRange As Range

    Set selectedRange = Application.Selection

    For Each cel In selectedRange.Cells
        Debug.Print cel.Address, cel.Value
    Next cel

End Sub

答案 5 :(得分:0)

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

如果有人仍然遇到此问题,

This会有所帮助。

这是一个跨浏览器的实现,因为我使用了一些针对不同浏览器的其他库,但如果你只是想要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事件上注入。

答案 6 :(得分:0)

环境:VS2017 C#、. net Framework 4.6,Win10。 IE11已安装。 无需在注册表上对FEATURE_BROWSER_EMULATION进行任何操作。

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

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

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

答案 7 :(得分:-2)

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