2016-11-29 4 views
0

Я хочу, чтобы мой браузер (GeckoFX) выполнял функцию .NET при нажатии на кнопку на моей веб-странице. У меня есть следующий код:Ошибка в 'AddMessageEventListener' на 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); 
} 

Но при выполнении этого кода, линия

browser.AddMessageEventListener(eventName, action); 

дает мне «ссылка на объект не указывает на экземпляр объекта» ошибки. Я не понимаю этого, потому что я проверил, что все объекты в этой строке инициализируются. Может кто-нибудь помочь и рассказать, почему я получаю эту ошибку?

спасибо!

+0

Может кто-нибудь помочь мне, пожалуйста? Это сводит меня с ума !!! Большое спасибо!!!!!!! – jaume

+0

Включает ли ваш код метод AddMessageEventListener? – Bartosz

ответ

0

Вы можете попробовать другой подход. Подписаться на браузер.DomClick event - он будет срабатывать при каждом нажатии. Оттуда вы можете отфильтровать неинтересные клики и только вызывать дополнительный код при нажатии на нужный элемент.

Browser.DomClick += browser_DomClick; 

А потом

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

Попробуйте поставить AddMessageEventListener после LoadHtml так:

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

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

И изменить его эти строки внутри LoadHtml:

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

К этому:

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

Ваш новый код выглядит следующим образом:

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); 
}