抑制WinForms WebBrowser控件的等待光标

3
考虑以下带有文本框和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代码构建一个Markdown编辑器,并使用Stackoverflow的MarkdownSharp库,类似于以下操作。

这个工作得很好,除了WebBrowser控件在设置DocumentText时坚持显示等待光标 - 即使更新浏览器内容只需要几毫秒。这会导致在文本框中输入时鼠标光标闪烁。

是否有任何方法可以抑制这些鼠标光标的变化?我已经考虑过限制DocumentText更新的速率,但我发现即使在更新期间偶尔出现闪烁仍然很烦人,我更喜欢即时更新。


编辑: Hans的答案指引我正确的方向。将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;
    };

编辑2:当页面变得更重,例如添加图片时,上述仍然显示等待光标。这可能可以通过对仅更改的html元素进行更细粒度的更新来修复,但这显然要复杂得多。
1个回答

5
将DocumentText属性分配是一件大事,WebBrowser将其视为导航命令。它无法区分。这通常需要时间,几百毫秒足以使它显示等待光标。
一种非常不同的方法是加载一个虚拟文档,并通过Document属性修改DOM。在网页、Ajax和javascript等方面很常见。对于这些情况没有等待光标。不确定它是否适合您的编辑模型,我猜测您想要加载一个带有空白的虚拟HTML文档并更改主体内容。
应该可以工作。备选方案是一个更新!按钮。这也避免了尝试呈现半成品和因此损坏的HTML。

1
这指引了我正确的方向,谢谢!我已经编辑了我的问题以展示最终解决方案。 - Wim Coenen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接