[英]WPF WebBrowser control doesn't enter design mode when the document property is changed
我有一個令人沮喪的問題。 這是我正在做的簡化版本:
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控件將不會變為可編輯狀態。 在圖片/鏈接上方移動時的鼠標指針顯示Web瀏覽器導航鼠標指針,而不是編輯指針。 如果我單擊文本,則不會顯示插入符號。
調試顯示在這種情況下文檔上的designMode屬性實際上設置為“On”,但控件的行為就像設置為“Off”一樣。
如果我在單擊“編輯”按鈕之前沒有單擊該網頁,則一切都按預期工作 。
詳細說明:如果在控件處於設計模式時單擊“取消”按鈕,如果單擊了文檔,則會得到相應的(錯誤)行為。
只需單擊“編輯”,然后“取消”,然后“編輯”等,而不必單擊文檔工作正常(鼠標懸停測試顯示正確的鼠標指針,我得到鏈接導航或編輯取決於設計模式,如果我單擊顯示文檔中的鏈接)。
我已經嘗試了各種技術來確保在更改designMode屬性之前另一個控件獲得焦點,但它沒有任何區別。 我搜索過MSDN和已知互聯網的一半,並沒有發現任何關於這類問題的提及。 像這樣翻轉designMode屬性似乎非常不尋常。
還有一小撮信息:我通過使用usercontrol實現的接收器建議文檔來設置文檔事件。 我懷疑這應該對這個問題有任何影響,但為了完整起見,我把它包含在這里。 更新:禁用此功能不會更改有關此問題的任何內容。
有人認出這個問題嗎?
更新:我通過在SetDesignMode()中重新創建Web瀏覽器控件來解決此問題。 這是一個丑陋的解決方案,但它的工作原理確實看起來不錯。 不過,我對這個問題的任何反饋都很感興趣。 我相信這是MSHTML中的一個錯誤。
我不太確定我們是否有完全相同的問題,但我想我的解決方案對你也有用。
基本問題似乎是x64重置了designMode屬性,如本文所述 。 在我的例子中,我在實例化webbrowser后將其設置為“On”,但在DocumentCompleted事件中,它再次是“Inherit”。 在DocumentCompleted中將其重新設置為“On”使其可編輯,但會清除文檔。 再次設置DocumentText會重新啟動整個doom循環。
所以我找到的一個解決方案是避免設置DocumentText,而是創建一個空文檔,然后設置body(此時不再為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時。 但是,還有另一種解決方案對我有用,看起來更容易,更安全。 我在LaughingJohn的回答中找到了它。 我想第一行取決於你的應用程序,你直接在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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.