注意:这是关于控件的内置行为,而不是关于创建双击事件。
我的一个项目使用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上。
重现的步骤:
将此代码添加到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
将该控件添加到表单
使用以下按钮向表单添加一个按钮。单击事件:
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
运行项目并单击按钮
如果直接在表单上抛出webbrowser控件,它将正常工作。问题出在usercontrol上(更新到IE10后只是一个问题)。
我可以使用VS 2010使用.Net 3.5和4.0重现问题。 我可以使用.Net 4.5使用VS 2012重现问题。
答案 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
事件处理程序,解决问题并恢复控件的双(+三)点击行为。
导致此问题的已知属性包括(但其他可能也会导致此问题或类似问题)
因此,如果在设计器中设置了这些属性中的任何一个,则将它们移动到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>