2013-03-29 22 views
4

的包裝上,我使用GeckoFX16XULRunner的-16.0.2.en-US.win32我的項目中調用JavaScript中的C#方法。 事情是,我想在JavaScript中調用C#方法。如何使用GeckoFX作爲XULRunner的

我很好奇,有沒有辦法做到這一點?

下面就跟:

C#部分:

private GeckoWebBrowser weBrowser; 
    public browser() 
    { 
     InitializeComponent(); 
     Gecko.Xpcom.Initialize("xulrunner"); 
     weBrowser = new GeckoWebBrowser(); 
     weBrowser.Parent = this; 
     weBrowser.Dock = DockStyle.Fill; 
     weBrowser.Navigate("test.html"); 
    } 

    public string loadData(){ 
     //load data from local file. 
     return str; 
    } 

javascript部分:

<script type='text/javascript'> 
    var data = window.loadData(); 
    alert(data); 
</script> 

我在這方面是新的,我如果有可能欣賞!

回答

5

你可以使用MessageEvent來調用c#中的代碼,但據我所知,你不能然後返回一個你想要的字符串。其中一個單元測試的演示瞭如何調用C#代碼:

[Test] 
public void AddEventListener_JScriptFiresEvent_ListenerIsCalledWithMessage() 
{ 
    string payload = null; 

    browser.AddMessageEventListener("callMe", ((string p) => payload = p)); 

    browser.LoadHtml(
     @"<!DOCTYPE html> 
        <html><head> 
        <script type='text/javascript'> 
         window.onload= function() { 
          event = document.createEvent('MessageEvent'); 
          var origin = window.location.protocol + '//' + window.location.host; 
          event.initMessageEvent ('callMe', true, true, 'some data', origin, 1234, window, null); 
          document.dispatchEvent (event); 
         } 
        </script> 
        </head><body></body></html>"); 

    browser.NavigateFinishedNotifier.BlockUntilNavigationFinished(); 
    Assert.AreEqual("some data", payload); 
} 

我知道這很尷尬,但你可以使用C# - > JavaScript調用獲取數據返回到JavaScript的土地。請參閱This Question瞭解如何操作。所以你的javascript會首先發送這個消息到c#land,然後它會得到一個你需要的字符串值的回調。

希望有所幫助。

+0

非常感謝不起作用!這真的是我想要的。 – Howard

+0

順便說一句如果你和我一樣,並且在設置其他事件(例如DocumentReady)的同時調用AddMessageEventListener,那麼你將得到一個NullRefException,但不知道什麼是錯誤的。看起來你需要在一段非特定的時間之後調用AddMessageEventListener,當它準備好並且已經準備就緒時。 – PandaWood

+0

當「p =>」完美無缺時,使用的語法是「((string p)=>」有點奇怪。 – PandaWood

2

您可以添加消息事件偵聽器,網頁瀏覽器,並調用你的方法是這樣的:

private void load() 
{ 
    browser.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> 
      <input type=""button"" onclick=""fireEvent('myFunction', 'some data');"" value=""SHOW DATA"" /> 
      </body></html>" 
    ); 
} 

...

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

現在,您可以添加更多的味精事件的味精監聽器(如果你需要的話)並以同樣的方式將它們全部解開。

6

重要更新:

目前代碼event.initMessageEvent,因爲這種結構已更換

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