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

Colors 如何在加载内容之前更改WebBrowser控件的背景色?,colors,browser,activex,document,flicker,Colors,Browser,Activex,Document,Flicker,我有一个网页,其中包含经常更新内容的WebBrowser控件。我使用的是黑色背景,但加载WebBrowser内容之前的默认颜色是白色。我可以通过加载一个背景设置为黑色的小HTML字符串来改变它,但是还有一段时间WebBrowser显示为白色,因此会出现一种闪烁的效果 我的问题是:有没有办法改变WebBrowser底层控件的颜色 我已经尝试了一些解决方案,比如在内容加载之前隐藏WebBrowser,但是这些方法都感觉不到很优雅,而且效果也不太好 注意:对于WP7/Silverlight,这个问题以

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

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

我已经尝试了一些解决方案,比如在内容加载之前隐藏WebBrowser,但是这些方法都感觉不到很优雅,而且效果也不太好


注意:对于WP7/Silverlight,这个问题以前已经问过并回答过了,但是我需要一个WPF/Winforms的解决方案。

在浏览器初始化之前,您只能阻止窗口可见。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:表单{
公共表格1(){
初始化组件();
}
受保护的覆盖无效SetVisibleCore(布尔值){
如果(!this.IsHandleCreated){
CreateHandle();
值=假;
webBrowser1.DocumentCompleted+=初始化完成;
webBrowser1.DocumentText=“”;
}
base.SetVisibleCore(值);
}
私有void初始化完成(对象发送方,WebBrowserDocumentCompletedEventArgs e){
webBrowser1.DocumentCompleted-=初始化完成;
可见=真实;
}
}

除了在浏览器自身初始化之前阻止窗口可见之外,您无能为力。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:表单{
公共表格1(){
初始化组件();
}
受保护的覆盖无效SetVisibleCore(布尔值){
如果(!this.IsHandleCreated){
CreateHandle();
值=假;
webBrowser1.DocumentCompleted+=初始化完成;
webBrowser1.DocumentText=“”;
}
base.SetVisibleCore(值);
}
私有void初始化完成(对象发送方,WebBrowserDocumentCompletedEventArgs e){
webBrowser1.DocumentCompleted-=初始化完成;
可见=真实;
}
}

我也有同样的问题。带有拆分容器和webbrowser的窗体。还有一个非白色背景:-)闪烁的声音让人无法忍受。无论如何,我通过游戏编程的方法获得了一些成功;在表单上放置一个计时器,让它每秒调用更新方法X次。update方法评估两个条件,这些条件决定是否应该使webbrowser可见。当然,更新方法必须是精简和平均的:

    private void OnPollForChanges(FormBrowseAllData inData)
    {

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

        if (mWebBrowserResizing>0)
        {
            mWebBrowserResizing--;
        }
当检测到调整大小或强制自己调整大小时,只需隐藏webbrowser进行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;
    }
以及:

这将闪烁减少到以前的5%左右。当然,这些都是蹩脚的技术,不是合适的解决方案


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

我也有同样的问题。带有拆分容器和webbrowser的窗体。还有一个非白色背景:-)闪烁的声音让人无法忍受。无论如何,我通过游戏编程的方法获得了一些成功;在表单上放置一个计时器,让它每秒调用更新方法X次。update方法评估两个条件,这些条件决定是否应该使webbrowser可见。当然,更新方法必须是精简和平均的:

    private void OnPollForChanges(FormBrowseAllData inData)
    {

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

        if (mWebBrowserResizing>0)
        {
            mWebBrowserResizing--;
        }
当检测到调整大小或强制自己调整大小时,只需隐藏webbrowser进行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;
    }
以及:

这将闪烁减少到以前的5%左右。当然,这些都是蹩脚的技术,不是合适的解决方案


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

问题在于。DocumentCompleted很晚才触发(在加载所有远程映像等之后),这会让用户等待不必要的时间。我也尝试了.Navigated,它发射的时间要早得多,但它仍然短暂地显示白色背景,所以很快就会发射。最后一种方法是监视.ReadyState属性,但它需要在循环中持续检查该值,因为它没有事件。我担心当webbrowser控件尝试加载时,该值的持续轮询会减慢它的速度。遗憾的是,没有“好”的方法来解决这个问题。好吧,把我推到DocumentText中的文档加载不需要很长时间。无论您从该服务器下载什么,都需要更长的时间。先做一个再做另一个,我给了您启动真正下载的触发器。它可能与WPF有关,但当我创建一个包含Webbrowser的TabItem,并从.DocumentCompleted事件中将TabItem添加到TabControl时,尽管文档已完全加载,我仍然会看到白色闪烁。有没有办法先强制重新粉刷呢?这叫做“闪烁”,你会看到一个白色的洞,在它还没来得及画自己的时候,窗户就掉在那里了。在WPF中很难摆脱。一个愚蠢的技巧是将窗口的不透明度属性设置为0.99。使黑洞变成黑色而不是白色。我想webbrowser会跳过所有渲染,直到它真正可见为止,必须有一些脏的p/invoke api来强制它在不可见状态下重新绘制,这应该可以消除我们看到的“延迟”。另一个原因可能是它是WPF窗口中的包装ActiveX,我希望WPF有一个“本机”HTML呈现组件。可以吗