我有一个令人沮丧的问题。这是我正在做的事情的简化版本:
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 属性,如 this article 中所述.在我的例子中,我在实例化 webbrowser 后将其设置为“On”,但在 DocumentCompleted 事件中,它又是“Inherit”。在 DocumentCompleted 中将其设置回“On”使其可编辑,但会清除文档。再次设置 DocumentText 会重新启动整个厄运循环。
所以我找到的一个解决方案是避免设置 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"
显然,只有当您准备好文本时,这才有效,如果您导航到 URL,则无效。但是,还有另一种对我有用的解决方案,它似乎更简单、更安全。我在 this answer 中找到了它通过 LaughingJohn。我想第一行取决于您的应用程序,您直接在 webBrowser1.Document 中有 IHTMLDocument。
doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
if (doc != null && doc.body != null)
((HtmlBody)doc.body).contentEditable = "true";
关于c# - 当更改文档属性时,WPF WebBrowser 控件不进入设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1766084/