为WinForms WebBrowser控件抑制WaitCursor

时间:2010-11-28 22:04:27

标签: c# winforms webbrowser-control

考虑以下带有文本框和webbrowser控件的简单WinForms表单。每当文本框内容发生变化时,文本都会被推送到浏览器:

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

(我在我的DownMarker代码中做了类似的事情,用Stackoverflow的MarkdownSharp库构建Markdown编辑器。)

这很好用,除了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元素进行更精细的更新,但这显然要复杂得多。

1 个答案:

答案 0 :(得分:5)

分配DocumentText属性是一件大事,WebBrowser将其视为导航命令。它无法区分。通常需要时间,数百毫秒,足以证明显示等待光标。

一种非常不同的方法是加载虚拟文档并通过Document属性更改DOM。这在网页,Ajax和javascript以及什么不是很常见。没有等待光标的人。不确定这是否仍然适合您的编辑模型,我猜您想要加载一个空的<body>的虚拟HTML文档并更改正文内容。

应该有效。备份计划是一个更新!按钮。这也可以避免尝试渲染半成品,从而破坏HTML。