簡體   English   中英

更改文檔屬性時,WPF WebBrowser控件不會進入設計模式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM