2009-11-19 50 views
5

我有一個令人沮喪的問題。以下是我正在做的簡化版本:當文檔屬性發生變化時,WPF WebBrowser控件不會進入設計模式

c#中的UserControl包含一個工具欄和一個嵌入式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屬性實際上設置爲「On」,但控件的行爲就像設置爲「Off」一樣。

如果我點擊「編輯」按鈕之前沒有點擊網頁中,一切正常

闡述: 如果我點擊「取消」按鈕時,控制在設計模式中,我得到相應的(MIS)的行爲,如果該文件已被點擊的

只需點擊「。編輯「,然後」取消「,然後」編輯「等,而不用單擊文檔就能正常工作(鼠標懸停測試顯示正確的鼠標指針,並且根據設計模式獲得鏈接導航或編輯,如果點擊鏈接顯示的文件)。

我試過各種技術來確保另一個控件在我更改designMode屬性之前獲得焦點,但它沒有任何區別。我搜索了MSDN和一半已知的互聯網,並沒有發現任何提及這類問題。像這樣翻轉designMode屬性似乎很不尋常。

另外還有一些信息:我通過建議使用由usercontrol實現的接收器來建立文檔事件。我懷疑這應該對問題有任何影響,但爲了完整起見,我將它包括在內。 更新:禁用此功能不會改變有關問題的任何內容。

有人認識到這個問題嗎?

更新: 我已經通過在SetDesignMode()中重新創建Web瀏覽器控件來解決此問題。這是一個醜陋的解決方案,但它的工作原理並確實看起來不錯。不過,我對這個問題的任何反饋都很感興趣。我相信這是MSHTML中的一個錯誤。

回答

8

我不太清楚,如果我們有完全相同的問題,但我想我的解決方案也應該爲你工作。

基本問題似乎是x64重置了designMode屬性,如this article中所述。在我的例子中,我在實例化webbrowser後將其設置爲「On」,但在DocumentCompleted事件中,它是「Inherit」。在DocumentCompleted中將其重新設置爲「On」使其可編輯,但清除文檔。再次設置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" 

顯然,這僅適用於準備好文本的情況,而不適用於導航到網址的情況。但是,還有另一種解決方案對我來說很合適,這似乎更簡單,更安全。我在LaughingJohn的this answer中找到它。我想第一行取決於你的應用程序,你直接在webBrowser1.Document中有IHTMLDocument。

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

這兩種方法的工作,謝謝。然而; 第一種方法以某種方式將我的「撤消」(Ctrl-Z/ExecCommand(「撤消」...))置於操作之外。 在第二種方法中,出於某種原因,更改未反映到webBrowser.DocumentText。我能夠通過webBrowser.Dcoument.Body.InnerHtml提取它,但解決了這個問題。 – Natan 2012-11-22 13:17:08

0

這聽起來像WebBrowser當你點擊它並以某種方式持有它時獲得焦點。試試這個:點擊WebBrowser,然後按下鍵盤上的Tab鍵(應該將焦點從WebBrowser移開),然後看看你是否可以點擊你的按鈕。

如果可以,請嘗試在Button.MouseEnter事件中附加處理程序,並在其中調用((Button)sender).Foucs()以編程方式聚焦該按鈕。

相關問題