注意:这是关于控件的内置行为,而不是创建双击事件。
我的一个项目使用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上。
重现步骤:
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重现问题。
问题实际上是IE 10中的一个错误。微软here证实了这一点。
最悲哀的是他们说他们不会很快(如果有的话)修理它,因为它影响的人太少(尽管它确实影响了我公司的数千名客户)。
虽然这已被报道为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
我知道有人问过这个问题,但是当我创建一个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();
}
现在双击将突出显示鼠标下的单词。
WebBrowser控件与其他控件不兼容,需要封装(包含在)Panel中,与其他表单控件隔离。
我在Tab控件中使用WebBrowser控件并遇到了同样的问题。在选项卡中添加Panel然后将WebBrowser放在面板中时,问题就消失了。
我迟到了,但其他人可能仍在寻求帮助。我有这个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;
}
}
});
我知道提供一个解决方案可能还为时已晚,但我最终修改并重写了一些我偶然发现的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事件。
环境:VS2017 C#,. net framework 4.6,Win10。 IE11已安装。注册表中的FEATURE_BROWSER_EMULATION没有操作。
在窗体上放置一个面板,然后在面板上放置一个WebBrowser控件。双击任何元素都不会选择html页面上的文本。
如果您不使用面板并将WebBrowser直接放在窗体上,它可以正常工作。如果你需要与面板一起使用怎么办?
在其上创建一个带有WebBrowser的简单用户控件,并公开WebBrowser所需的事件和属性。将此用户控件放在任何面板上,双击选择文本将按照应有的方式工作。
在文件的开头插入<!DOCTYPE html>