Internet Explorer 9 RC停止了我的WinForms WebBrowser控件在编辑模式下工作。

4
使用设置为OnIHtmlDocument2.designMode 属性来将托管在 Windows Forms 表单上的 WebBrowser 控件切换到编辑模式,在安装 Microsoft Internet Explorer 9 RC 后突然停止工作。
问题:
有什么办法可以修复这个问题吗?
我已经尝试过调整文档类型或使用EmulateIE7元标记,但都没有成功。
(例如,此项目
更新2011-02-21:
正如Eric Lawrence所建议的那样,我调整了"Zeta"示例以在设置编辑模式之前设置文档文本。
不幸的是,我仍未能切换到设计模式。
更新2011-02-24: 讨论的部分也发生在 Eric 的博客中
更新2011-02-26:
目前我经历的情况是,行为似乎对于 HTTP URL 和通过WebBrowser.DocumentText添加的内容有所不同。
第一次测试似乎证明了这个假设。
我现在要围绕这个假设构建一个解决方案,并在此处发布更新和概念验证。
更新2011-02-26(2):
我现在已经构建了一个内置 Web 服务器的概念验证,我相信它也可以与 IE 9 很好地配合使用。如果有人想下载和测试它是否正常工作并给我一个简短的反馈,我可以清理并发布此源代码。
更新2011-02-26(3):
还没有反馈,我仍然在Code Project上的 HTML 编辑控件文章和演示进行更新。

更新2011-03-16:

由于Internet Explorer 9昨天发布,我们更新了我们的主要产品,使用本文中描述的集成Web服务器的想法,如HTML编辑控件文章所述。

经过近一个月的测试,我认为它运行得相当不错。

如果您将来遇到任何问题,请在此处发表评论,我可以进行调查和修复。


1
我已经在IE 9 RC反馈中记录了这个问题,并附上了此页面的链接。我的现有代码也存在同样的问题,该代码基于code project上的某些内容。我认为这个链接可能会有所帮助:http://www.codeproject.com/KB/edit/editor_in_windows_forms.aspx - PeteT
@PeteT你能在这里发布一下你的IE 9 RC反馈页面链接吗? - Uwe Keim
1
好的,我通过IE 9菜单将反馈提交到了他们的连接网站:https://connect.microsoft.com/IE/feedback/details/648138/net-webbrowser-control-wont-enter-design-mode。 - PeteT
@PeteT 谢谢!提醒其他人点击 PeteT 的链接时需要先加入 IE 9 计划的“连接”才能成功,否则会出现“文档未找到”(或类似)的提示信息。 - Uwe Keim
1
哦,对不起,我以为如果您没有加入连接计划,它只会链接到一个Live ID登录。 - PeteT
9个回答

8
我有一个类似的问题,通过在DocumentCompleted事件中添加以下行来解决它:
 ((HTMLBody)_doc.body).contentEditable = "true";

1
这对我有用。我的应用程序WebBrowser编辑现在可以与ie9一起使用。win7-64,ie9-64。 - P a u l
2
非常有帮助...但是还需要@Michael的代码才能确保一切都稳定。 - John
1
@John 你太棒了!IE每次都让我的生活变得更加困难... 小注释,DocumentCompleted使用sender(浏览器)和Document是HtmlDocument对象,我在转换时遇到了一些问题。这里是一个属性转换的解决方案,只需一行代码,如果其他人需要的话:(((sender as WebBrowser).Document.DomDocument as IHTMLDocument2).body as HTMLBody).contentEditable = "true"; - Alex

2

我们只需要一个空的可编辑控件。然而,我通过调试器逐步执行并向控件的InnerHtml添加值,它可以正常显示,并且我可以编辑它。

小更新,我们还能够使用以下行使控件可编辑:

browserControl.browser.Document.Body.SetAttribute("contentEditable", "true");

这使我们避免了引用mshtml(无需包含Microsoft.mshtml.dll)。

这样可以避免增加安装大小8兆字节。


1
幸运的是!我做了与你描述的类似的所有工作。虽然它在大多数机器上都能正常工作,但有些机器上却无法正常工作 :-( 急需一个稳定的Chrome .NET封装程序... - Uwe Keim

1

你的确切代码是什么?

如果我设置以下代码:

    private void cbDesign_CheckedChanged(object sender, EventArgs e){
        var instance =
    Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(
    wbView.ActiveXInstance,
    null,
    @"Document",
    new object[0],
    null,
    null, null );

         var objArray1 = new object[] { cbDesign.Checked ? @"On" : @"Off" };

    Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSetComplex(
    instance,
    null,
    @"designMode",
    objArray1,
    null,
    null,
    false,
    true );

IE9 浏览器实例可以轻松地进入设计模式。如果您在进入设计模式后将“Zeta”示例更改为不设置文档文本,它也可以正常工作。

非常感谢,Eric。我通常采取的基本步骤(并且这些步骤已经运行多年)是在OnDocumentCompleted事件中设置设计模式。但是,在最新版本的IE 9中,这种方法不再切换到设计模式了(在IE 9 beta中,它可以切换,但不再显示插入符号)。我尝试了另一种方法,即将<body>标签的contentEditable属性设置为true而不是设置设计模式。(这是它的源代码)。现在,我将尝试按照您的建议修改我的示例,以在进入设计模式后不设置文档文本。 - Uwe Keim
还有一个问题:你能想象为什么“Zeta”示例在IE9 RC中不能直接使用了吗?我是否依赖于IE6、7和8的某些未定义行为?还是这是一种新的安全限制? - Uwe Keim

1
另一个代码项目用户suggested建议使用以下代码:
首先,添加事件DocumentCompleted
private void SetupEvents()
{
    webBrowser1.Navigated += webBrowser1_Navigated;
    webBrowser1.GotFocus += webBrowser1_GotFocus;
    webBrowser1.DocumentCompleted += this.theBrowser_DocumentCompleted;
}

然后编写函数:

private void theBrowser_DocumentCompleted(
    object sender, 
    WebBrowserDocumentCompletedEventArgs e)
{
    webBrowser1.Document.Write(webBrowser1.DocumentText);
    doc.designMode = "On";
}

虽然我没有测试过,但为了完整性,我想在这里记录一下。


1
我认为这种方法可能有效。最终我抽出时间来查看我的项目,并使用webBrowser_GotFocus事件来设置designMode。我使用了这个事件,因为我的项目有多个Web浏览器控件响应相同的事件,所以这使得它更容易。 - PeteT
1
取消之前的话,我说得太早了。将其放入设计模式确实有效,但正如您所说,它会清除您已经添加的任何内容。 - PeteT
@PeteT - 是的,这就是为什么我最终将嵌入式Web服务器放在库内部的原因。我真的没有找到其他可靠的方法。 - Uwe Keim
2
在调试代码后,我发现在DocumentCompleted事件中设置((HTMLBody)_doc.body).contentEditable = "true";对我有效,尽管需要进行其他一些更改。我不能说这是理想的解决方案,但我也不想添加Web服务器。我认为既然现在它能够工作,我会先将其保留下来,看看是否可以稍后实现开源替代方案。有人建议使用此处找到的writer http://www.lutzroeder.com/dotnet/ 我还没有查看源代码以确定它是否依赖于后台的任何内容。 - PeteT
1
有一个项目chromiumembedded和一个.NET包装器CefSharp,我过去已经成功地作为概念验证尝试过了。注意事项:a)目前仅处于alpha版本,b)Webkit似乎比MSHTML具有更糟糕的HTML编辑器实现。 - Uwe Keim

1

如果在文档加载后设置属性,则属性将被固定

private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{

    IHTMLDocument2 Doc = Document.DomDocument as IHTMLDocument2;
    Doc.designMode = @"On";
}

谢谢,@Prads - 在我的测试中,将 designMode 设置为 On 时,它清除了内容。也许我会再试一次。 - Uwe Keim

1

只想补充一下,我也无法进入设计模式(在我的情况下使用WebBrowser控件)。这在beta版中不是问题。肯定是RC版本的新问题。


谢谢。我刚刚建立了一个概念验证。它能在你的IE 9安装中运行吗? - Uwe Keim
谢谢!你可以尝试查看我的代码 HTML Edit Control example,看看它是否适合你的需求。 - Uwe Keim

0

我也能够通过在DocumentCompleted事件中使用以下内容使其工作:

IHTMLDocument2 Doc = browserControl.browser.Document.DomDocument as IHTMLDocument2;
if (Doc != null) Doc.designMode = @"On";

谢谢大家!


您需要编辑现有内容还是只需获取一个空的可编辑HTML控件? - Uwe Keim

0

我使用HTML编辑器控件,通过添加DocumentComplete事件解决了这个问题。

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    (((sender as WebBrowser).Document.DomDocument as IHTMLDocument2).body as HTMLBody).contentEditable = "true"; 
}

0

昨天,Internet Explorer 9 RTM终于发布了。

我对我的控件进行了一些微小的调整,但基本上集成的小型Web服务器的想法似乎运行得相当不错。

因此,解决方案在这篇Code Project文章中:

Zeta HTML Edit Control
Windows Forms 2.0 WebBrowser控件的一个小包装类

这是唯一对我有效的解决方案。

我希望回答自己的问题并将我的答案标记为“已回答”,这样可以吗?!?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接