C# 重新绘制WebBrowser内容时是否触发事件?
我使用的是WebBrowser控件,在某一点上,我更新元素的样式,例如:C# 重新绘制WebBrowser内容时是否触发事件?,c#,C#,我使用的是WebBrowser控件,在某一点上,我更新元素的样式,例如:WebBrowser1.Document.GetElementById(“elementId”).style=“color:red” WebBrowser控件将自动重新绘制以反映更改的样式,但不会触发DocumentCompleted事件。 在这种情况下是否有触发的事件?默认情况下,WinFormsWebBrowser控件不提供此类事件。 但是该控件非常强大,因此通过一些技巧,您可以实现所需的行为:您已经发现,您可以通过Do
WebBrowser1.Document.GetElementById(“elementId”).style=“color:red”代码>
WebBrowser控件将自动重新绘制以反映更改的样式,但不会触发DocumentCompleted事件。
在这种情况下是否有触发的事件?默认情况下,WinFormsWebBrowser
控件不提供此类事件。
但是该控件非常强大,因此通过一些技巧,您可以实现所需的行为:您已经发现,您可以通过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");
}
默认情况下,WinFormsWebBrowser
控件不提供此类事件。
但是该控件非常强大,因此通过一些技巧,您可以实现所需的行为:您已经发现,您可以通过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");
}
你为什么需要这样的活动?没有这方面的活动。你为什么需要这样的活动?没有这方面的活动。谢谢你,卢克格夫,我会尝试这种方法。谢谢你,卢克格夫,我会尝试这种方法。