C# WPF WebBrowser控件没有';当文档属性更改时,t进入设计模式

C# WPF WebBrowser控件没有';当文档属性更改时,t进入设计模式,c#,wpf,webbrowser-control,mshtml,C#,Wpf,Webbrowser Control,Mshtml,我有一个令人沮丧的问题。以下是我所做工作的简化版本: c#中的UserControl包含工具栏和嵌入式WebBrowser对象。工具栏包含一个“编辑”按钮,单击该按钮可将webbrowser控件设置为设计模式。另一个按钮“取消”关闭设计模式 伪代码(非常简化): public void SetDesignMode(bool dm) { IHTMLDocument2 doc = webBrowser.Document as IHTMLDocument2; if (dm) doc.desig

我有一个令人沮丧的问题。以下是我所做工作的简化版本:

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

伪代码(非常简化):

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控件将不可编辑。浏览图片/链接时,鼠标指针将显示web浏览器导航鼠标指针,而不是编辑鼠标指针。如果我在文本中单击,插入符号将不会显示

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

如果我在单击“编辑”按钮之前没有单击网页,一切正常

精化: 如果我在控件处于设计模式时单击“取消”按钮,如果文档已被单击,我将获得相应的(mis)行为

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

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

还有一个小贴士:我通过使用usercontrol实现的接收器通知文档来设置文档事件。我怀疑这与这个问题有什么关系,但为了完整起见,我把它包括在这里更新:禁用此功能不会改变与问题相关的任何内容

有人认识到这个问题吗

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

在我看来,
网络浏览器
在您单击它并以某种方式保持它时,会获得焦点。尝试以下操作:单击
WebBrowser
,然后按键盘上的Tab键(这将使焦点离开
WebBrowser
),然后查看是否可以单击按钮


如果可以,请尝试将处理程序附加到
按钮.MouseEnter
事件并调用
((按钮)sender).Foucs()
,以编程方式聚焦按钮。

我不太确定是否存在完全相同的问题,但我想我的解决方案也应该适用于您

基本问题似乎是x64重置了designMode属性,如中所述。在我的例子中,我在实例化webbrowser之后将其设置为“开”,但在DocumentCompleted事件中,它再次被设置为“继承”。在DocumentCompleted中将其设置回“开”将使其可编辑,但会清除文档。再次设置DocumentText将重新启动整个doom循环

因此,我找到的一个解决方案是避免设置DocumentText,而是创建了一个空文档,然后设置正文(此时不再为null)的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"

两种方法都有效,谢谢。然而;第一种方法不知何故使我的“Undo”(Ctrl-Z/ExecCommand(“Undo”…)无法工作。在第二种方法中,由于某些原因,更改不会反映到webBrowser.DocumentText。不过,我可以通过webBrowser.dcoment.Body.InnerHtml提取它,并修复了这个问题。
doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
if (doc != null && doc.body != null)
    ((HtmlBody)doc.body).contentEditable = "true";