简体   繁体   中英

Suppress WaitCursor for WinForms WebBrowser control

Consider the following simple WinForms form with a textbox and a webbrowser control. Whenever the textbox content changes, the text is pushed to the browser:

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>";
    }
}

(I am doing something like this in my DownMarker code to build a Markdown editor with Stackoverflow's MarkdownSharp library.)

This works fine, except that the WebBrowser control insists on showing the wait cursor whenever DocumentText is set - even if updating the browser content takes only a few milliseconds. This results in mouse cursor flicker when typing in the textbox.

Is there any way to supress these mouse cursor changes? I already considered rate-limiting the DocumentText updates, but I find that the occasional flicker during an update is still annoying and I would prefer instant updates.


edit: Hans' answer pointed me in the right direction. Changing the TextChanged event handler to this seems to work without cursor flicker:

 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 : the above still shows the wait cursor when the page is made heavier, eg by adding images. This might be fixable be doing more fine grained updates of just the html elements that change, but that is obviously much more complex.

Assigning the DocumentText property is a Big Deal, WebBrowser treats it like a navigation command. It can't tell the difference. Which normally takes time, hundreds of milliseconds, enough for it to justify displaying the wait cursor.

A very different approach would be to load a dummy document and alter the DOM through the Document property. That's pretty common in web pages, Ajax and javascript and what-not. No wait cursor for those. Not so sure if that will still fit your editing model, I'd guess at you wanting to load a dummy HTML document with a empty <body> and change the body content.

Should work. Back-up plan is an Update! button. Which would also avoid trying to render half-finished and thus broken HTML.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM