2013-07-06 13 views
6

注意:这是关于控件的内置行为,而不是创建双击事件。IE浏览器安装后双击WebBrowser控件不会自动选择文本

我的一个项目使用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专业版,安装零更新)它工作得很好。

经过一些进一步的测试,在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. 一个按钮添加到窗体具有以下button.Click事件:

    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. 然后,尝试双击“有趣”一词并注意它没有选择。

如果您直接在窗体上放置webbrowser控件,它将正常工作。问题出在用户控件上(并且在更新到IE10后,这只是一个问题)。

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

+0

如果问题如您所述,修复可能位于IE设置中。 –

+0

@AndrewBarber知道WHICH设置是一个问题会有所帮助。简单安装IE 10就是引起这种行为所必需的 - 不需要设置更改。 – John

+0

我见过其他控件也行为不当 - 一些自定义下拉控件不允许点击列表中的项目。有没有人遇到类似的东西? –

回答

3

问题的开始其实是这是由微软here证实了IE 10的错误。

最可悲的是,他们说,任何时间很快,他们不会被修复它(如果有的话),因为它影响的人太少了(尽管它影响成千上万我公司的客户)。

+0

作为微软的员工,但不以任何方式代表公司,这种行为有点可以理解,但仍然非常令人沮丧。有时候我希望计划会稍微轻松一些,并且工作得更充分。 ;)我很希望看到文化找到一种方法来弥补时间上的空白,找到只影响0.05%的事情的修复。 – matthewsheets

+0

我有数以万计的客户谁使用我的这个产品。它不仅影响我,还会影响所有使用我的应用的人。这些都是微软的客户。我非常沮丧,这个问题还没有解决,现在我正在重写我的应用程序来运行跨平台(Linux,Mac等)。 – John

-2

插入<!DOCTYPE html>在你的文件

+0

这不能解决问题。 – John

0

web浏览器控件不与其他控件发挥好,这是需要封装(内包含)一个面板,从其它表单控件隔离。

我是用一个选项卡控件WebBrowser控件和有同样的问题。当在选项卡中添加Panel时,将WebBrowser放置在面板中,问题就消失了。

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(); 
} 

现在双击将突出鼠标下的字。

+0

旧的,但我仍然在等待解决方法。我试过你的解决方案,看起来很合理,但是,我无法让它工作。当我尝试使用'rng.pasteHTML('blah blah blah')'时,它会插入该文本,但它会在文档的开头执行该操作。我需要在范围上设置某种位置吗? – John

+0

我无法得到上面的工作。它始终是sel.type =“None”和rng.text = null,而.expand和.select似乎什么都不做。 –

+0

我得到了这个解决方案的工作。 pasteHTML也替代了选定的文本。如果您双击某个结果不是文本范围(如图像,iframe或pre元素)的某些内容,某些双击选择可能会为null。选择之后,您可能需要重新调整文档焦点,然后才能键入以进行替换。使用类似web.Document.Focus(); – GrayDwarf

2

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

有趣的是,最好的解决办法我发现是从@约翰对中国DataZX论坛同样的问题张贴。

基本上当System.Windows.Forms.WebBrowser控制的某些属性是从设计者一个用户控件这使得其方式进入UserControl.Designer.InitializeComponent()方法内设置的问题出现。将这些属性分配移到稍后在初始化过程中发生,例如:进入UserControl.Load事件处理程序,解决问题并且控制的双击(+三重)点击行为被恢复。

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

  • ScriptErrorsSuppressed
  • AllowWebBrowserDrop

所以,如果这两种性质的设计者设定,将它们移动到Load事件处理程序,现在双击应该按预期工作。从UserControl.designer

EG(问题代码。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 
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; 
       } 
      } 
     }); 
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事件。

相关问题