2015-12-19 134 views
1

我在窗體中使用了webbrowser控件。爲了允許用戶操作網頁,我將該控件添加到用戶可以隱藏一些HTML元素的新窗體中。這是我如何隱藏的元素:如何強制WebBrowser控件重新繪製並重繪網頁元素

IHTMLElement2 dom = item.DomElement as IHTMLElement2; 
    dom.runtimeStyle.visibility = "hidden"; 

當用戶關閉該第二種形式,我轉了隱藏和可見的元素,然後再添加web瀏覽器到我的主要形式。這是代碼切換元素的可見性,要做到這一點我做可見body隱蔽性和隱藏要素:

void SwitchVisibility() 
{ 
    IHTMLElement bodyDom = wb.Document.Body.DomElement as IHTMLElement; 
    bodyDom.style.visibility = "hidden"; 

    foreach (var item in addedElements) 
    { 
     IHTMLElement2 dom = item.DomElement as IHTMLElement2; 
     dom.runtimeStyle.visibility = "visible"; 
    } 
} 

我打電話,即使和主窗體form2.ShowDialog()後一次以上form2_closing的過程,但除非我最小化和最大化主要形式,否則這些更改不會反映在控件上。如果我不切換元素的可見性,我應該添加,這些更改會反映出來!另外,如果我將上面的代碼放在按鈕的click事件中,則會顯示所需的更改。

我使用的網頁瀏覽器方法Refresh,但它實際上重新加載該文件,然後我用的主要形式的Refresh方法,但它也不起作用。我想知道文檔及其元素的可見性如何刷新。

+0

如果你確定你需要重繪控制,你可以嘗試'webBrowser1.Invalidate();' –

+0

@RezaAghaei當我最小化和最大化主窗體時,我看到了期望的內容。然而,在'form2.ShowDialog()'後面使用'invalidate()'也不起作用。 – Ahmad

+0

所以也許最好共享一個簡單的代碼來重現問題。因爲現在我們只能猜測一些事情。 –

回答

1

正如我測試,我必須調用主窗體的SwitchVisibility的窗口2關閉後和webbrowser加入的主要形式如下:

 FormBrowser browser = new FormBrowser(); 
     browser.Browser = webBrowser1; 

     browser.ShowDialog(); 


     // Readd the webbrowser1 
     panel1.Controls.Add(webBrowser1); 
     webBrowser1.Location = loc; 
     webBrowser1.Size = size; 
     webBrowser1.BringToFront(); 

     // if this function is called in `Closing` 
     // event of form2, the chanes are not reflected. 

     SwitchVisibility(addedElements); 
     /// To reassure repainting (however it works without it too) 
     webBrowser1.Invalidate();