2016-11-29 3 views
0

Ich möchte, dass mein Browser (GeckoFX) eine .NET-Funktion ausführt, wenn Sie auf eine Schaltfläche auf meiner Webseite klicken. Ich habe den folgenden Code:Fehler in 'AddMessageEventListener' auf GeckoFX

public Form1() 
{ 
    InitializeComponent(); 

    AddMessageEventListener("myFunction", ((string s) => this.showMessage(s))); 

    browser.LoadHtml 
    (
     @"<!DOCTYPE html> 
      <html><head> 
      <meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8""> 
      <script type=""text/javascript""> 
       function fireEvent(name, data) 
       { 
        event = document.createEvent('MessageEvent'); 
        event.initMessageEvent(name, false, false, data, null, null, null, null); 
        document.dispatchEvent(event); 
       } 
      </script> 
      </head> 
      <body>fdsfsda 
       <input type=""button"" onclick=""fireEvent('myFunction', 'some data');"" value=""SHOW DATA"" /> 
      </body></html>" 
    ); 
} 

public void AddMessageEventListener(string eventName, Action<string> action) 
{ 
    browser.AddMessageEventListener(eventName, action); 
} 

private void showMessage(string s) 
{ 
    MessageBox.Show(s); 
} 

Aber wenn dieser Code ausgeführt wird, die Linie

browser.AddMessageEventListener(eventName, action); 

gibt mir ein ‚Objektverweis nicht auf eine Instanz eines Objekts festgelegt‘ Fehler. Ich verstehe das nicht, weil ich überprüft habe, dass alle Objekte in dieser Zeile initialisiert sind. Kann jemand helfen und erzählen, warum ich diesen Fehler bekomme?

Vielen Dank!

+0

Kann mir bitte jemand helfen? Das macht mich verrückt !!! Vielen Dank!!!!!!! – jaume

+0

Gibt Ihr Code die Methode 'AddMessageEventListener' ein? – Bartosz

Antwort

0

Sie können einen anderen Ansatz versuchen. Das browser.DomClick-Ereignis abonnieren - es wird ausgelöst, wenn auf etwas geklickt wird. Von dort aus können Sie uninteressante Klicks herausfiltern und nur weiteren Code aufrufen, wenn Sie auf das gewünschte Element klicken.

Browser.DomClick += browser_DomClick; 

Und dann

private void browser_DomClick(object sender, DomMouseEventArgs e) 
     { 
      var browser = sender as GeckoWebBrowser; 

      if (sender != null && e != null && e.Target != null) 
      { 
       if (e.Button == GeckoMouseButton.Left) 
       { 
        HandleLeftClick(e); 
       } 
       if (e.Button == GeckoMouseButton.Middle) 
       { 
        HandleMiddleClick(e); 
       } 
       if (e.Button == GeckoMouseButton.Right) 
       { 
        HandleRightClick(e); 
       } 
      } 
     } 
0

Try AddMessageEventListener nach loadhtml wie folgt zu setzen:

browser.LoadHtml(@"<!DOCTYPE html>.....</html>"); 

AddMessageEventListener("myFunction", ((string s) => this.showMessage(s))); 

und ändern Sie diese Zeilen in Ihrem loadhtml:

event = document.createEvent('MessageEvent'); 
event.initMessageEvent(name, false, false, data, null, null, null, null); 

Durch diese:

var event = new MessageEvent(name,{'view': window, 'bubbles': false, 'cancelable': false, 'data': data}); 

Ihr neuer Code wie folgt aussehen:

public Form1() 
{ 
    InitializeComponent(); 

    browser.LoadHtml 
    (
     @"<!DOCTYPE html> 
      <html><head> 
      <meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8""> 
      <script type=""text/javascript""> 
       function fireEvent(name, data) 
       { 
        var event = new MessageEvent(name,{'view': window, 'bubbles': false, 'cancelable': false, 'data': data}); 
        document.dispatchEvent(event); 
       } 
      </script> 
      </head> 
      <body>fdsfsda 
       <input type=""button"" onclick=""fireEvent('myFunction', 'some data');"" value=""SHOW DATA"" /> 
      </body></html>" 
    ); 

    AddMessageEventListener("myFunction", ((string s) => this.showMessage(s))); 
} 

private void showMessage(string s) 
{ 
    MessageBox.Show(s); 
}