C# 重新绘制WebBrowser内容时是否触发事件?

C# 重新绘制WebBrowser内容时是否触发事件?,c#,C#,我使用的是WebBrowser控件,在某一点上,我更新元素的样式,例如:WebBrowser1.Document.GetElementById(“elementId”).style=“color:red” WebBrowser控件将自动重新绘制以反映更改的样式,但不会触发DocumentCompleted事件。 在这种情况下是否有触发的事件?默认情况下,WinFormsWebBrowser控件不提供此类事件。 但是该控件非常强大,因此通过一些技巧,您可以实现所需的行为:您已经发现,您可以通过Do

我使用的是WebBrowser控件,在某一点上,我更新元素的样式,例如:
WebBrowser1.Document.GetElementById(“elementId”).style=“color:red”

WebBrowser控件将自动重新绘制以反映更改的样式,但不会触发DocumentCompleted事件。
在这种情况下是否有触发的事件?

默认情况下,WinForms
WebBrowser
控件不提供此类事件。 但是该控件非常强大,因此通过一些技巧,您可以实现所需的行为:您已经发现,您可以通过
Document
属性访问DOM树,但您也可以通过
ObjectForScripting
属性和方法
Document.InvokeScript
与WebBrowser中运行的脚本通信。由于“香草”Javascript可以监听DOM树的更改,因此您可以创建一个脚本,用于注册此类更改并将它们路由到承载
WebBrowser
控件的应用程序

下面的小类只是一个示例,您当然可以更改Javascript侦听器以接收更专门的事件

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[ComVisibleAttribute(true)]
public class DOMListener
{
    public event Action DOMChanged;

    private WebBrowser Browser;

    public DOMListener(WebBrowser webbrowser)
    {
        this.Browser = webbrowser;
        this.Browser.ObjectForScripting = this;
        this.Browser.DocumentCompleted += OnDOMLoaded;
    }

    private void OnDOMLoaded(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        HtmlElement script = this.Browser.Document.CreateElement("script");
        script.InnerHtml = "function listenToDOM() { document.addEventListener('DOMSubtreeModified', function(e) { window.external.DOMUpdate() }); }";
        this.Browser.Document.GetElementsByTagName("body")[0].AppendChild(script);
        this.Browser.Document.InvokeScript("listenToDOM");
    }

    public void DOMUpdate()
    {
        if (this.DOMChanged != null) this.DOMChanged.Invoke();
    }
}
只需使用WebBrowser作为参数创建此类的实例,就可以通过
DOMChanged
事件接收DOM树更改:

private DOMListener Listener;

public Form1()
{
    this.InitializeComponent();
    this.Listener = new DOMListener(this.WebBrowser);
    this.Listener.DOMChanged += this.OnDOMChanged;
    this.WebBrowser.Navigate("www.google.de");
}

void OnDOMChanged()
{
    Console.WriteLine(DateTime.Now.ToLongTimeString() + ": DOM changed");
}

默认情况下,WinForms
WebBrowser
控件不提供此类事件。 但是该控件非常强大,因此通过一些技巧,您可以实现所需的行为:您已经发现,您可以通过
Document
属性访问DOM树,但您也可以通过
ObjectForScripting
属性和方法
Document.InvokeScript
与WebBrowser中运行的脚本通信。由于“香草”Javascript可以监听DOM树的更改,因此您可以创建一个脚本,用于注册此类更改并将它们路由到承载
WebBrowser
控件的应用程序

下面的小类只是一个示例,您当然可以更改Javascript侦听器以接收更专门的事件

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[ComVisibleAttribute(true)]
public class DOMListener
{
    public event Action DOMChanged;

    private WebBrowser Browser;

    public DOMListener(WebBrowser webbrowser)
    {
        this.Browser = webbrowser;
        this.Browser.ObjectForScripting = this;
        this.Browser.DocumentCompleted += OnDOMLoaded;
    }

    private void OnDOMLoaded(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        HtmlElement script = this.Browser.Document.CreateElement("script");
        script.InnerHtml = "function listenToDOM() { document.addEventListener('DOMSubtreeModified', function(e) { window.external.DOMUpdate() }); }";
        this.Browser.Document.GetElementsByTagName("body")[0].AppendChild(script);
        this.Browser.Document.InvokeScript("listenToDOM");
    }

    public void DOMUpdate()
    {
        if (this.DOMChanged != null) this.DOMChanged.Invoke();
    }
}
只需使用WebBrowser作为参数创建此类的实例,就可以通过
DOMChanged
事件接收DOM树更改:

private DOMListener Listener;

public Form1()
{
    this.InitializeComponent();
    this.Listener = new DOMListener(this.WebBrowser);
    this.Listener.DOMChanged += this.OnDOMChanged;
    this.WebBrowser.Navigate("www.google.de");
}

void OnDOMChanged()
{
    Console.WriteLine(DateTime.Now.ToLongTimeString() + ": DOM changed");
}

你为什么需要这样的活动?没有这方面的活动。你为什么需要这样的活动?没有这方面的活动。谢谢你,卢克格夫,我会尝试这种方法。谢谢你,卢克格夫,我会尝试这种方法。