代码之家  ›  专栏  ›  技术社区  ›  Wim Coenen

取消WinForms WebBrowser控件的WaitCursor

  •  3
  • Wim Coenen  · 技术社区  · 13 年前

    考虑下面的简单WinForms表单,其中包含一个文本框和一个webbrowser控件。每当文本框内容更改时,文本将被推送到浏览器:

    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 图书馆。)

    这很好,除了 WebBrowser 控件坚持在 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;
        };
    

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

    1 回复  |  直到 11 年前
        1
  •  5
  •   Hans Passant    13 年前

    分配DocumentText属性是一件大事,WebBrowser将其视为导航命令。它分辨不出区别。这通常需要数百毫秒的时间,足够显示等待光标。

    一个非常不同的方法是加载一个虚拟文档并通过document属性更改DOM。这在web页面、Ajax和javascript中非常常见。没有等待光标。不确定这是否仍然适合您的编辑模型,我猜您希望加载一个空的虚拟HTML文档 <body> 改变身体的内容。

    应该有用。备份计划是一个更新!按钮。这也可以避免呈现半成品,从而破坏HTML。