2010-11-28 22 views
3

次の単純なWinFormsフォームを、テキストボックスとWebブラウザコントロールで検討してください。たびテキストボックスの内容の変更は、テキストがブラウザにプッシュされます。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>"; 
    } 
} 

(。私はStackOverflowののMarkdownSharpライブラリとマークダウンエディタを構築するために、私のDownMarkerコードでこのような何かをしています)

これは正常に動作しますDocumentTextが設定されているときにWebBrowserコントロールが待機カーソルを表示することを主張している点を除いて、ブラウザのコンテンツを更新するのに数ミリ秒しかかかりません。この結果、テキストボックスに入力する際に​​マウスカーソルがちらつくことになります。

これらのマウスカーソルの変更を抑制する方法はありますか?私はすでにDocumentTextのアップデートをレート制限することを検討しましたが、アップデート中の時折起こるちらつきがまだ迷惑で、私は即時のアップデートを好むでしょう。


編集:ハンスの答えが正しい方向を指しています。

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:これにTextChangedイベントハンドラを変更すると、カーソルのちらつきなしで動作しているようです上記は、まだページが重く、例えば行われる待機カーソルを示しイメージを追加します。これは変更可能なhtml要素だけを細かく更新することで解決できるかもしれませんが、それははるかに複雑です。

答えて

5

DocumentTextプロパティを割り当てることはビッグディールであり、WebBrowserはこれをナビゲーションコマンドのように扱います。違いは分かりません。これは、通常、待機カーソルの表示を正当化するのに十分な時間(数百ミリ秒)を要します。

ダミーのドキュメントを読み込んでDocumentプロパティでDOMを変更するというアプローチは非常に異なります。これは、Webページ、Ajax、javascriptなどでよく見かけるものです。それらの待機カーソルはありません。それがまだあなたの編集モデルに合っているかどうかは分かりませんが、空の<body>のダミーHTML文書を読み込み、本文の内容を変更したいと思います。

バックアップ計画は更新です!ボタン。また、半完成して壊れたHTMLをレンダリングしようとするのを避けるでしょう。

+1

これは正しい方向に私を指摘しました、ありがとう!私は最終的な解決策を示すために私の質問を編集しました。 –

関連する問題