2012-02-02 23 views
10

Używam formantu WebBrowser WPF do załadowania prostej strony internetowej. Na tej stronie mam kotwicę lub przycisk. Chcę przechwycić zdarzenie kliknięcia tego przycisku w kodzie mojej aplikacji (tj. W języku C#).Kontrola przeglądarki: jak przechwytywać zdarzenia dokumentów?

Czy istnieje sposób, w jaki kontrolka WebBrowser może przechwytywać zdarzenia kliknięcia na wczytanych elementach strony?

Dodatkowo, czy możliwe jest przesyłanie danych uruchamianych zdarzeniem między stroną a WebBrowser? Wszystkie powyższe powinny być możliwe, czy mam rację?

  • Edit: Prawdopodobne rozwiązanie:

Znalazłem poniższy link, który może być rozwiązaniem. Nie testowałem jeszcze tego, ale warto spróbować. Zaktualizuje to pytanie w zależności od wyników testu.

http://support.microsoft.com/kb/312777

Odpowiedz

13

Ok Odpowiedź znaleziono - przetestowany i działa:

  • Dodaj odwołanie od karcie COM o nazwie: Przedmiot Microsoft HTML Biblioteka

Poniżej znajduje się przykładowy kod:

Trzeba będzie z dwóch komponentów: WebBrowser (webBrowser1) i TextBox (TextBox1)

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     webBrowser1.LoadCompleted += new LoadCompletedEventHandler(webBrowser1_LoadCompleted); 
    } 

    private void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e) 
    { 
     mshtml.HTMLDocument doc; 
     doc = (mshtml.HTMLDocument)webBrowser1.Document; 
     mshtml.HTMLDocumentEvents2_Event iEvent; 
     iEvent = (mshtml.HTMLDocumentEvents2_Event)doc; 
     iEvent.onclick += new mshtml.HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler); 
    } 

    private bool ClickEventHandler(mshtml.IHTMLEventObj e) 
    { 
     textBox1.Text = "Item Clicked"; 
     return true; 
    } 
} 
+1

Ponieważ nie podano innych odpowiedzi, wybiorę to jako odpowiedź. Chociaż znalazłem lepszy sposób rozwiązania tego problemu. Metoda jest opisana w http://www.codegain.com/articles/wpf/ieprogramming/working-with-webbrowser-in-wpf.aspx i używa klasy o nazwie ObjectForScriptingHelper. Bardzo łatwe do wdrożenia i działa jak urok. – Bassem

+1

Wydaje się, że działa to tylko 20% czasu, przez większość czasu nie nazywa się "ClickEventHandler", mimo że metoda LoadCompleted kończy się całkowicie bez wyjątków, które mogę zobaczyć ... Jakieś pomysły? Opublikowalem o tym tutaj: http://stackoverflow.com/questions/35058874/wpf-webbrowser-open-links-in-default-browser –

+1

Artykuł o odnośniku autorstwa @Bassem można znaleźć tutaj: http: // www .dotnetfunda.com/articles/show/840/working-with-webbrowser-in-wpf –

2

Oto kolejny przykład.

Próbowałam wstrzyknąć plik javascript zdalnego wykonania kodu i gdy jest gotowy, dodając element DOM <script src="{path to remote file}" /> do nagłówka zasadniczo tej samej idei jako jQuery.getScript(url, callback) .. poniżej

Kod działa poprawnie.

HtmlElementCollection head = browser.Document.GetElementsByTagName("head"); 
if (head != null) 
{ 
    HtmlElement scriptEl = browser.Document.CreateElement("script"); 
    IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement; 
    element.src = url; 
    element.type = "text/javascript"; 
    head[0].AppendChild(scriptEl); 
    // Listen for readyState changes 
    ((mshtml.HTMLScriptEvents2_Event)element).onreadystatechange += delegate 
    { 
     if (element.readyState == "complete" || element.readyState == "loaded") 
     { 
      Callback.execute(callbackId); 
     } 
    }; 
} 
Powiązane problemy