次の単純な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要素だけを細かく更新することで解決できるかもしれませんが、それははるかに複雑です。
これは正しい方向に私を指摘しました、ありがとう!私は最終的な解決策を示すために私の質問を編集しました。 –