我有一个令人沮丧的问题。这是我正在做的事情的简化版本:

C# 中的 UserControl 包含一个工具栏和一个嵌入的 WebBrowser 对象。工具栏包含一个“编辑”按钮,单击该按钮会将 Web 浏览器控件设置为设计模式。另一个按钮“取消”可关闭设计模式。

伪代码(非常简化):

public void SetDesignMode(bool dm) {
  IHTMLDocument2 doc = webBrowser.Document as IHTMLDocument2;
  if (dm) doc.designMode = "On";
  else doc.designMode = "Off";
  _designMode = dm;
  ReloadDocument(); // setting designmode clears the document element, so it must be reloaded
}

public void OnLoadCompleted() {
  IHTMLDocument2 doc = webBrowser.Document as IHTMLDocument2;
  if (!_documentLoaded) {
    if (_designMode) doc.designMode = "On";
    else doc.designMode = "Off";
    ReloadDocument();
    _documentLoaded = true;
  }
}

public void ReloadDocument() {
  _documentLoaded = false;
  // code that navigates to the document
}

问题:如果我单击显示的网页,然后单击“编辑”按钮,WebBrowser 控件将无法编辑。将鼠标悬停在图片/链接上时,鼠标指针显示网络浏览器导航鼠标指针,而不是编辑鼠标指针。如果我单击文本,插入符号将不会显示。

调试显示,在这种情况下,文档上的 designMode 属性实际上设置为“On”,但控件的行为就像设置为“Off”一样。

如果我 在单击“编辑”按钮之前单击网页, 一切都按预期进行.

详细说明:如果我在控件处于设计模式时单击“取消”按钮,如果已单击文档,我会得到相应的(错误)行为。

只需单击“编辑”,然后单击“取消”,然后单击“编辑”等。无需单击文档就可以正常工作(鼠标悬停测试显示正确的鼠标指针,如果单击显示文档中的链接,我可以根据设计模式进行链接导航或编辑)。

我尝试了各种技术来确保在更改 designMode 属性之前另一个控件获得焦点,但这没有任何区别。我搜索了MSDN和一半的已知互联网,没有发现任何提及此类问题的信息。像这样翻转 designMode 属性似乎很不寻常。

还有一则信息:我通过使用用户控件实现的接收器向文档提供建议来设置文档事件。我怀疑这应该对问题有任何影响,但为了完整起见,我将其包含在这里。 更新: 禁用此功能不会改变有关问题的任何内容。

有人认识到这个问题吗?

更新:我通过在 SetDesignMode() 中重新创建 Web 浏览器控件来解决该问题。这是一个丑陋的解决方案,但它有效并且看起来确实不错。不过,我对有关此问题的任何反馈都很感兴趣。我相信这是 MSHTML 中的一个错误。

有帮助吗?

解决方案

我不太确定我们是否遇到完全相同的问题,但我想我的解决方案也应该适合您。

基本问题似乎是 x64 重置了 designMode 属性,如中所述 本文. 。就我而言,我在实例化网络浏览器后将其设置为“打开”,但在 DocumentCompleted 事件中,它再次“继承”。在 DocumentCompleted 中将其设置回“打开”使其可编辑,但会清除文档。再次设置 DocumentText 会重新启动整个厄运循环。

因此,我发现的一个解决方案是避免设置 DocumentText,而是创建一个空文档,然后设置正文的(此时不再为空)InnerHtml 属性:

doc.designMode = "On"; // enable editing

// designMode change resets the document, create it anew
webBrowser1.Document.Write("<html><body></body></html>")
webBrowser1.Document.Body.InnerHtml = "myDocumentText"

显然,这仅在您准备好文本时才有效,而在导航到 URL 时则无效。然而,还有另一种对我有用的解决方案,它看起来更简单、更安全。我发现它在 这个答案 作者:笑约翰。我想第一行取决于您的应用程序,您直接在 webBrowser1.Document 中拥有 IHTMLDocument。

doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
if (doc != null && doc.body != null)
    ((HtmlBody)doc.body).contentEditable = "true";

其他提示

这听起来我像WebBrowser得到,当你点击它的重点并以某种方式持有它。试试这个:点击WebBrowser,然后按键盘上的Tab键(其中的的移动焦点从WebBrowser),然后看看是否可以通过点击按钮

如果可以的话,则尝试处理程序安装到其中的Button.MouseEnter事件和呼叫((Button)sender).Foucs()以编程聚焦的按钮。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top