2017-01-31 42 views
0

我使用WebBrowser控件,並在某一點上我更新元素的風格,例如:WebBrowser1.Document.GetElementById("elementId").Style = "color: red";WebBrowser內容重繪時是否觸發了事件?

WebBrowser控件會自動重現,以反映變化的風格,但DocumentCompleted事件不會火。 在這種情況下是否有事件發生?

+0

爲什麼你需要這樣的事件? –

+0

沒有這個事件。 – Equalsk

回答

1

默認情況下,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"); 
} 
+0

謝謝,lukegv,我會試試這個方法。 –

相關問題