2017-01-31 4 views
0

Я использую элемент управления WebBrowser, и в определенный момент я обновить стиль элемента с, например: WebBrowser1.Document.GetElementById("elementId").Style = "color: red";Происходит ли событие, когда содержимое WebBrowser перерисовывается?

управления WebBrowser автоматически обновляется, чтобы отразить измененный стиль, но событие DocumentCompleted не Огонь. Есть ли событие, которое срабатывает в этом случае?

+0

Зачем вам такое событие? –

+0

Для этого события нет. – Equalsk

ответ

1

По умолчанию элемент управления WinForms WebBrowser не предоставляет такого события. Но контроль действительно могучий, поэтому с некоторыми трюками вы можете реализовать свое желаемое поведение: вы уже обнаружили, что вы можете получить доступ к дереву DOM с помощью свойства Document, но вы также можете общаться со сценариями, запущенными в WebBrowser, как с помощью ObjectForScripting и метод Document.InvokeScript. Поскольку Javascript «Vanilla» может прослушивать изменения дерева 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 в качестве аргумента, и вы будете иметь возможность получить DOM изменения дерева через DOMChanged событие:

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

Спасибо, лужев, я попробую этот подход. –

Смежные вопросы