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

问题描述 投票:6回答:8

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

我的一个项目使用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并且没有问题,问题就开始发生了。所以,我很确定问题出在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. 然后,尝试双击“有趣”一词,注意它没有选择。

如果您直接在表单上抛出webbrowser控件,它将正常工作。问题出在usercontrol上(更新到IE10后只是一个问题)。

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

.net winforms webbrowser-control
8个回答
3
投票

问题实际上是IE 10中的一个错误。微软here证实了这一点。

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


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

1
投票

我知道有人问过这个问题,但是当我创建一个HTML Editor控件并安装了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
投票

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

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


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事件。


0
投票

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

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

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

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


-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.