我有一个页面,其中包含经常更新内容的WebBrowser控件。我使用的是黑色背景,但在加载WebBrowser内容之前的默认颜色是白色。我可以通过加载一个背景设置为黑色的小HTML字符串来更改它,但是仍然有一段时间WebBrowser显示为白色,因此会出现一种闪烁效果。
我的问题是:有没有办法改变WebBrowser底层控件的颜色?
我尝试了一些解决方案,例如隐藏WebBrowser直到内容已经加载,但这些解决方案都没有感觉非常优雅,并且不能很好地工作。
注意:在WP7 / Silverlight之前已经提出并回答了这个问题,但我需要一个WPF / Winforms的解决方案。
答案 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同步改变,但无论如何“更安全而不是抱歉”是这里的座右铭。