2

我正在创建一个与 Google 的 Maps API v3 接口的应用程序。我目前的方法是WebBrowser使用WebBrowser.Navigate("Map.html"). 目前这工作正常;但是,我也知道WebBrowser.InvokeScript(). 我已经看到它用于执行 javascript 函数,但我希望有类似以下结构的东西:

APICalls.js - 包含可以调用的不同函数,如果需要,甚至可以为每个函数分离出一个文件。

地图接口.cs

WebBrowser.InvokeScript("APICalls.js", args)- 或直接控制 javascript 变量。

我已经看到了使用的InvokeScript方法,但是没有一个示例详细说明了函数的来源,所以我不确定它是从 html 文件还是 js 文件中调用它。是否有可能拥有这样的结构或类似的组织结构,而不是在每个文件中创建一个带有 javascript 的 html 文件并使用Navigate()

此外,有没有更简单的方法可以将 Google Maps 与 WPF 结合使用。我检查了一下,但我发现的所有资源都至少有 2-3 年的历史,我认为这比最新版本的地图 API 还要旧。

4

1 回答 1

4

我无法建议将 Google Maps API 与 WPF 一起使用的更好方法(尽管我确信它存在),但我可以尝试回答其余问题。

  • 首先,确保启用FEATURE_BROWSER_EMULATION您的 WebBrowser 应用程序,以便 Google Maps API 将其识别为支持 HTML5 的现代浏览器。

  • 然后,导航到“Map.html”页面并让它完成加载。这是如何使用它来完成async/await的(代码是针对 WinForms 版本的WebBrowser控件,但概念保持不变)。

  • 您可以将 APICalls.js 作为单独的本地文件,但您需要<script>从 C# 为其创建和填充元素。您为会话执行一次。

例子:

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!");

[更新]如果您正在寻找更模块化或面向对象的方法,您可以利用dynamicC# 的特性。例子:

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());
于 2013-10-24T06:56:09.577 回答