2010-11-28 48 views
3

考慮以下帶有文本框和webbrowser控件的簡單WinForms窗體。當文本框內容發生變化時,文本推到瀏覽器:(我做這樣的事情在我DownMarker代碼來構建與#1的MarkdownSharp庫降價編輯)爲WinForms WebBrowser控件抑制WaitCursor

public class MainForm : Form 
{ 
    public MainForm() 
    { 
     var browser = new WebBrowser() { Dock = DockStyle.Fill }; 
     var textbox = new TextBox() { Dock = DockStyle.Fill, Multiline = true }; 
     var splitter = new SplitContainer() { Dock = DockStyle.Fill }; 

     splitter.Panel1.Controls.Add(textbox); 
     splitter.Panel2.Controls.Add(browser); 
     this.Controls.Add(splitter); 

     textbox.TextChanged += delegate { browser.DocumentText = textbox.Text; }; 
     textbox.Text = "<b>hello world</b>"; 
    } 
} 

這工作正常,除非WebBrowser控件在設置DocumentText時堅持要顯示等待光標 - 即使更新瀏覽器內容只需要幾毫秒。這會導致在文本框中輸入時鼠標光標閃爍。

有什麼辦法抑制這些鼠標光標變化?我已經考慮過限速DocumentText更新,但是我發現在更新期間偶爾閃爍仍然很煩人,我寧願立即更新。


編輯:漢斯的回答指出了我的正確方向。 TextChanged事件處理程序更改爲這個好像沒有光標閃爍的工作:

textbox.TextChanged += 
    delegate 
    { 
     if (browser.Document == null) 
     { 
      browser.DocumentText = "<html><body></body></html>"; 
     } 
     while ((browser.Document == null) 
      || (browser.Document.Body == null)) 
     { 
      Application.DoEvents(); 
     } 
     browser.Document.Body.InnerHtml = textbox.Text; 
    }; 

EDIT2:上面仍然顯示網頁時更重,例如等待光標通過添加圖像。這可能是可以修復的,只是對更改後的html元素進行更細粒度的更新,但顯然要複雜得多。

回答

5

指定DocumentText屬性是一項大事,WebBrowser將其視爲導航命令。它無法分辨差異。這通常需要幾百毫秒的時間,足以證明顯示等待光標。

一種非常不同的方法是加載一個僞文檔並通過Document屬性改變DOM。這在網頁,Ajax和JavaScript以及不是什麼的情況下很常見。沒有等待那些光標。不太確定這是否仍然適合您的編輯模型,我猜想您希望加載一個空的<body>虛擬HTML文檔並更改主體內容。

應該工作。備份計劃是一個更新!按鈕。這也將避免嘗試渲染一半並因此破壞HTML。

+1

這指出我在正確的方向,謝謝!我編輯了我的問題以顯示最終解決方案。 – 2010-11-28 23:13:10