我不能建議使用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());
我已經有類似的解決方案來了,但是目前它只是從JavaScript中'initialize'儘快執行,因爲它負載。儘管如此,我更喜歡從C#調用的能力。據我瞭解,'InvokeScript'一旦被加載到HTML中就被函數名稱調用?我在電話的文檔中沒有看到明確的解釋,所以我很困惑。並感謝「FEATURE_BROWSER_EMULATION」提示。我遇到了一些Maps API無法執行HTML5內容的問題。 – danielunderwood
@ danielu13,yes'InvokeScript'可以調用頁面全局JavaScript名稱空間中可用的函數,包括DOM'window'對象上明確可用的函數。如果你正在尋找更多的模塊化方法,我已經用一個例子更新了答案。 – Noseratio
嗯。我在'script.appendChild(htmlDocument.createTextNode(scriptText));'上得到了意外的方法或屬性訪問調用。我注意到的一個奇怪的事情是'htmlDocument.body'和'htmlDocument.doctype'都是空的,但顯然在html頁面中。有任何想法嗎? – danielunderwood