2012-03-02 91 views
2

我正在使用Visual C#Winforms來控制WebBrowser對象。WebBrowser控件和GetElement編號

具體而言,我想使用WebBrowser.Document.GetObjectByID(「myid」).Style設置加載到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.Navigate("about:blank")之後的任何時刻撥打webBrowser1.Update(),那麼frmView_Load中的所有內容都可以正常工作。不幸的是,任何嘗試在frmView_Load退出後更改文檔都將失敗。它們不僅會失敗,而且在frmView_Load返回webBrowser1.Document之後,它將以某種方式設置爲NULL。 任何人都可以闡明這種控制應該如何工作?

+0

您正在使用哪個'WebBrowser'控件? Windows窗體? WPF? – 2012-03-02 04:43:26

+0

System.Windows.Forms.WebBrowser – 2012-03-02 05:15:56

+0

你的問題有點複雜,我嘗試了代碼並單擊表單上的一個按鈕(它不是一個<輸入按鈕>?)將答案更改爲白色或黑色。另一件事情對我來說是不同的,「在我退出該函數後.Style屬性爲null」後,風格就爲我設定了。你可以編輯你的問題,讓FormLoad事件設置初始HTML,並且有一個button_click事件來改變顏色,這樣每個人都可以很容易地重新渲染。 – 2012-03-02 05:37:18

回答

2

的最後審查WebBrowser控件上的MS文檔後,我意識到瀏覽器所做的一切都是異步的。話雖如此,這意味着我必須在設置屬性後阻止我的控制線程,以確保這些屬性已設置。

基本上,我對文檔的「寫入」不是因爲「寫入」函數返回而完成的。如果我想引用該寫入的內容,我必須阻止控制線程,直到文檔反映這些更改。 MS建議使用睡眠循環。這裏是我寫的&塊功能看起來像:

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; 
    } 
} 

感謝您的回覆所有人。

0

爲什麼不把你的隱藏文字放在<div>display:none風格?當你需要展示它時,你只需要更新display風格。您也可以將此樣式應用於示例代碼中包含答案的h2元素。

+0

嗯,我試過了你的建議,但效果和我現在做的一樣。我最初將樣式應用於H2元素,但現在我正在使用DIV。我想我可能會錯過某種事件觸發器。如果我製作第二個按鈕只設置樣式,則可以使用。但是如果我使用相同的函數來創建HTML *和*修改樣式,它不會。 – 2012-03-02 05:18:28

0

我不是真正熟悉這個東西,但我會認爲你需要調用

webBrowser1.Refresh(); 

在frmView_Load

+0

試過這也沒有區別。另外,btnAnswer_Click方法不會調用刷新,並且可以無風險地更新樣式。 – 2012-03-02 17:59:22