如何强制WebBrowser控件重新绘制和重绘网页元素

时间:2015-12-19 16:24:02

标签: c# winforms controls webbrowser-control

我在表单中使用webbrowser控件。为了允许用户操作网页,我将控件添加到一个新表单中,用户可以在其中隐藏一些HTML元素。这是我隐藏元素的方式:

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

当用户关闭第二个表单时,我切换隐藏和可见元素并再次将WebBrowser添加到我的主表单。这是切换元素可见性的代码,为此,我隐藏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_closing偶数和主表单中的form2.ShowDialog()之后调用了上面的过程,但这些更改不会反映在控件上,除非我最小化并最大化主窗体。我应该添加,如果我不切换元素的可见性,更改反映!另外,如果我将上面的代码放在按钮的click事件中,则会显示所需的更改。

我使用了 webbrowser Refresh方法,但它实际上重新加载了文档,然后我使用了主窗体的Refresh方法,但它也不起作用。我想知道文档及其元素的可见性是如何刷新的。

1 个答案:

答案 0 :(得分:1)

正如我测试的那样,我必须在关闭form2之后调用主窗体中的SwitchVisibility并将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();