如何在加载内容之前更改WebBrowser控件的背景颜色?

时间:2011-10-29 11:46:12

标签: colors browser activex document flicker

我有一个页面,其中包含经常更新内容的WebBrowser控件。我使用的是黑色背景,但在加载WebBrowser内容之前的默认颜色是白色。我可以通过加载一个背景设置为黑色的小HTML字符串来更改它,但是仍然有一段时间WebBrowser显示为白色,因此会出现一种闪烁效果。

我的问题是:有没有办法改变WebBrowser底层控件的颜色?

我尝试了一些解决方案,例如隐藏WebBrowser直到内容已经加载,但这些解决方案都没有感觉非常优雅,并且不能很好地工作。

注意:在WP7 / Silverlight之前已经提出并回答了这个问题,但我需要一个WPF / Winforms的解决方案。

2 个答案:

答案 0 :(得分:4)

在浏览器初始化之前,您可以做的事情不多但会阻止窗口显示。一个winforms解决方案:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }
    protected override void SetVisibleCore(bool value) {
        if (!this.IsHandleCreated) {
            CreateHandle();
            value = false;
            webBrowser1.DocumentCompleted += initializationDone;
            webBrowser1.DocumentText = "<body bgcolor=#000000></body>";
        }
        base.SetVisibleCore(value);
    }
    private void initializationDone(object sender, WebBrowserDocumentCompletedEventArgs e) {
        webBrowser1.DocumentCompleted -= initializationDone;
        this.Visible = true;
    }
}

答案 1 :(得分:0)

我遇到了同样的问题。带有splitcontainer和webbrowser的表单。而非白色背景:-)闪烁是无法忍受的。无论如何,我采用游戏编程方法取得了一些成功;在表单上放一个计时器,让它每秒调用一次更新方法X次。 update方法评估了几个条件,这些条件决定了Web浏览器是否应该可见。当然,更新方法必须精简并且意味着:

    private void OnPollForChanges(FormBrowseAllData inData)
    {

        webBrowser1.Visible = (mWebBrowserResizing == 0) && 
                    (!mWebBrowserLoading) && 
                    webBrowser1.ReadyState >= WebBrowserReadyState.Interactive;

        if (mWebBrowserResizing>0)
        {
            mWebBrowserResizing--;
        }

当您检测到调整大小或强制自己调整大小时,您只需隐藏Web浏览器以获取X更新:

    private void webBrowser1_Resize(object sender, EventArgs e)
    {
        mWebBrowserResizing = 5;
        webBrowser1.Visible = false;
    }

当你做一些可能导致重新加载的事情时:

    private void SetHTML(string inHTML)
    {
        webBrowser1.Visible = false;
        mWebBrowserLoading = true;
        webBrowser1.DocumentText = inHTML;
    }

    void OnWebBrowserDocumentCompleted(object sender, 
            WebBrowserDocumentCompletedEventArgs e)
    {
        mWebBrowserLoading = false;
    }

这可将闪烁减少到之前的5%左右。当然,这些只是蹩脚的黑客而不是正确的解决方案。

PS:使用mWebBrowserLoading和检查webBrowser1.ReadyState之间存在一些重叠。因为理论上ReadyState应该与mWebBrowserLoading同步改变,但无论如何“更安全而不是抱歉”是这里的座右铭。