0
我遇到了使用webbrowser控件正确显示html的问题。我的目标是将自定义html添加到webbrowser控件,并显示它,并将其截图保存为png。目前我正在使用Document.OpenNew和Document.Write(htmlText)和Application.DoEvents()。然而,因为我在后台线程中运行它,有时它会死锁。我知道罪魁祸首是Application.DoEvents()给我带来麻烦。webbrowser控件不“渲染”html
但是,如果我删除并直接将html设置为DocumentText属性,我怎么知道它何时完全“呈现”或加载。我使用了DocumentCompleted Event,但这似乎不起作用,因为即使在事件触发后,保存的图像仍为空。
我也有线程作为STA。
这里是现有代码:
Thread th = new Thread(new ThreadStart(createImage));
th.SetApartmentState(ApartmentState.STA);
th.Start();
th.Join(TIMEOUT);
private void createImage() {
var browser = new WebBrowser();
var doc = browser.Document;
doc.OpenNew(false);
doc.Write("<html><body>....</body><html>)");
//loop for few seconds
for(int i=0; i<20; i++)
{
Application.DoEvents();
Thread.Sleep(100);
}
//save to file as png.
}
这里是我尝试代码:
private void createImage() {
var browser = new WebBrowser();
bool docComplete = false;
browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(
(Object sender, WebBrowserDocumentCompletedEventArgs args) =>
{ docComplete = true; }
);
browser.DocumentText = "<html>.....";
while (!_docComplete)
{
Thread.Sleep(100);
}
// save image
// :-(not working
}
我已经有线程作为STA(编辑我的问题)。就像我在问题中所说的那样,DocumentCompleted不适合我。 – user1750192
已更新我的回答 – volody
太棒了!那工作。而不是在同一个事件中处理事件,而是使用单独的方法做到这一点! – user1750192