我正在使用Visual C#Winforms来控制WebBrowser对象。
具体来说,我想使用WebBrowser.Document.GetObjectByID(“myid”)。样式设置对象的样式,该对象是加载到WebBrowser对象中的文档的一部分。
我想让WinForm上的按钮将标题的样式从“display:none”切换为“display:block; text-align:middle”。 这就是我在做的事情:
private void frmView_Load(object sender, EventArgs e)
{
string question = "How many cows?";
string answer = "5 cows";
webBrowser1.Navigate("about:blank");
webBrowser1.Document.OpenNew(false);
webBrowser1.Document.Write("<html><body><div id='question'><h1>");
webBrowser1.Document.Write(question);
webBrowser1.Document.Write("</h1></div><div id='answer'><h2>");
webBrowser1.Document.Write(answer);
webBrowser1.Document.Write("</h2></div></body></html>");
webBrowser1.Refresh();
webBrowser1.Document.GetElementById("answer").Style = "display:none;";
//if I do a breakpoint here, I get the Style = "DISPLAY:NONE"
btnAnswer.Visible = true;
btnNext.Visible = true;
}
private void btnAnswer_Click(object sender, EventArgs e)
{
//if this is the first time ran, doing a breakpoint here will
//show Style to be NULL
webBrowser1.Document.GetElementById("answer").Style = "display:block;text-align:center";
//now the Style is properly set, and will remain that way, even after this function returns}
请注意,我可以使用btnAnswer_Click方法控制Style属性,但不能使用frmView_Load方法控制。我知道我可以在创建它时将样式信息放入div标签(这确实有效),但为什么上面的代码不起作用?
更新:
我找到了可能正朝着正确方向发展的事情。如果我在webBrowser1.Update()
frmView_Load中的所有内容之后的任何时候调用webBrowser1.Navigate("about:blank")
。不幸的是,在frmView_Load退出后更改文档的任何尝试都将失败。它们不仅会失败,而且在frmView_Load返回后,webBrowser1.Document将以某种方式设置为NULL。
任何人都可以了解这种控制应该如何运作?
答案 0 :(得分:2)
在审查了WebBrowser控件上的MS文档后,我意识到浏览器所做的一切都是异步的。话虽如此,这意味着我必须在设置属性后阻止我的控制线程,以确保已设置这些属性。
基本上,我对文档的“写入”并不是因为“write”函数返回。我必须阻止控制线程,直到文档反映这些更改,如果我想引用该写入的内容。 MS建议使用睡眠循环。这是我的写作&amp;块功能看起来像:
private void ChangeDocument(string documentText, double timeout)
{
DateTime startTime = DateTime.Now;
double elapsed = 0;
if (webBrowser1.Document == null)
{
webBrowser1.Navigate("about:blank");
}
webBrowser1.Document.OpenNew(false);
while ((webBrowser1.DocumentText != "") && (elapsed < timeout))
{
Thread.Sleep(50);
elapsed = DateTime.Now.Subtract(startTime).TotalMilliseconds;
}
webBrowser1.Document.Write(documentText);
startTime = DateTime.Now;
elapsed = 0;
while ((webBrowser1.DocumentText != documentText) && (elapsed < timeout))
{
System.Threading.Thread.Sleep(50);
elapsed = DateTime.Now.Subtract(startTime).TotalMilliseconds;
}
}
感谢大家的回复。
答案 1 :(得分:0)
为什么不将隐藏文字放在<div>
样式的display:none
中?当您需要显示它时,您只需要更新display
样式。您还可以将此样式应用于示例代码中包含答案的h2
元素。
答案 2 :(得分:0)
我不是很熟悉这些东西,但我认为你需要打电话
webBrowser1.Refresh();
在frmView_Load
的最后