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