我使用WebBrowser控件,並在某一點上我更新元素的風格,例如:WebBrowser1.Document.GetElementById("elementId").Style = "color: red";
WebBrowser內容重繪時是否觸發了事件?
WebBrowser控件會自動重現,以反映變化的風格,但DocumentCompleted事件不會火。 在這種情況下是否有事件發生?
我使用WebBrowser控件,並在某一點上我更新元素的風格,例如:WebBrowser1.Document.GetElementById("elementId").Style = "color: red";
WebBrowser內容重繪時是否觸發了事件?
WebBrowser控件會自動重現,以反映變化的風格,但DocumentCompleted事件不會火。 在這種情況下是否有事件發生?
默認情況下,WinForms WebBrowser
控件不提供此類事件。 但是控制真的很強大,所以有些技巧可以實現你想要的行爲:你已經發現,你可以通過Document
屬性訪問DOM樹,但是你也可以通過ObjectForScripting
與WebBrowser中運行的腳本進行通信財產和方法Document.InvokeScript
。由於'Vanilla'Javascript可以監聽DOM樹的變化,所以你可以創建一個腳本來註冊這些變化,並將它們路由到主控制器的應用程序。
下面的小類只是一個例子,它可以工作,當然你可以改變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();
}
}
只需用web瀏覽器作爲參數,創建這個類的一個實例,你將能夠接收通過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");
}
謝謝,lukegv,我會試試這個方法。 –
爲什麼你需要這樣的事件? –
沒有這個事件。 – Equalsk