2013-10-23 39 views
2

我正在創建一個與Google Maps API v3接口的應用程序。我目前的方法是使用控制WebBrowser.Navigate("Map.html")。目前這個工作正常;不過,我也知道WebBrowser.InvokeScript()。我看到這個用來執行JavaScript的功能,但我想有類似的結構如下:從WPF爲Google Maps API使用JavaScript

APICalls.js - 包含可以被調用,甚至分離到每個文件不同的功能功能如有必要。

MapInterface.cs

WebBrowser.InvokeScript("APICalls.js", args) - 直接控制的JavaScript變量。

我已經看到了InvokeScript使用的方法,但沒有一個例子給出了函數源的任何細節,所以我不確定它是否從html文件或js文件調用它。有沒有可能像這樣的結構,或類似的組織結構,而不是創建一個JavaScript文件在每一個HTML文件,並使用Navigate()

此外,有沒有更簡單的方法使用WPF的谷歌地圖。我檢查了一下,但我發現的所有資源都至少有2-3年的歷史,我認爲這些資源比地圖API的最新版本要舊。

回答

4

我不能建議使用Google Maps API和WPF的更好方式(雖然我確定它存在),但我可以嘗試回答問題的其餘部分。

  • 首先,請確保啓用FEATURE_BROWSER_EMULATION爲您的web瀏覽器的應用程序,因此谷歌地圖API承認是它在現代HTML5的瀏覽器。

  • 然後,導航到您的「Map.html」頁面,讓它完成加載。可以使用async/await(代碼是用於控制WebBrowser的WinForms版本,但概念保持不變)完成。

  • 您可以將APICalls.js作爲單獨的本地文件,但您需要爲C#創建併爲其填充<script>元素。你爲會議做了一次。

例子:

var scriptText = File.ReadAllText("APICalls.js"); 
dynamic htmlDocument = webBrowser.Document; 
var script = htmlDocument.createElement("script"); 
script.type = "text/javascript"; 
script.appendChild(htmlDocument.createTextNode(scriptText)); 
htmlDocument.body.appendChild(script); 

例如,在APICalls.js你的JavaScript入口點函數可能看起來像這樣:

(function() { 
    window.callMeFromCsharp = function(arg1, arg2) { 
     window.alert(arg1 + ", " +arg2); 
    } 
})(); 

,你可以從C#調用是這樣的:

webBrowser.InvokeScript("callMeFromCsharp", "Hello", "World!"); 

[更新]如果您正在尋找更多模塊化或面向對象的方法,您可以利用C#的dynamic功能。例如:

的JavaScript:

(function() { 
    window.apiObject = function() { 
     return { 
      property: "I'm a property", 
      Method1: function(arg) { alert("I'm method 1, " + arg); }, 
      Method2: function() { return "I'm method 2"; } 
     }; 
    } 
})(); 

C#:

dynamic apiObject = webBrowser.InvokeScript("apiObject"); 
string property = apiObject.property; 
MessageBox.Show(property); 
apiObject.Method1("Hello!"); 
MessageBox.Show(apiObject.Method2()); 
+0

我已經有類似的解決方案來了,但是目前它只是從JavaScript中'initialize'儘快執行,因爲它負載。儘管如此,我更喜歡從C#調用的能力。據我瞭解,'InvokeScript'一旦被加載到HTML中就被函數名稱調用?我在電話的文檔中沒有看到明確的解釋,所以我很困惑。並感謝「FEATURE_BROWSER_EMULATION」提示。我遇到了一些Maps API無法執行HTML5內容的問題。 – danielunderwood

+0

@ danielu13,yes'InvokeScript'可以調用頁面全局JavaScript名稱空間中可用的函數,包括DOM'window'對象上明確可用的函數。如果你正在尋找更多的模塊化方法,我已經用一個例子更新了答案。 – Noseratio

+0

嗯。我在'script.appendChild(htmlDocument.createTextNode(scriptText));'上得到了意外的方法或屬性訪問調用。我注意到的一個奇怪的事情是'htmlDocument.body'和'htmlDocument.doctype'都是空的,但顯然在html頁面中。有任何想法嗎? – danielunderwood