2

Google の Maps API v3 と連携するアプリケーションを作成しています。私の現在のアプローチは、WebBrowserによるコントロールを使用していWebBrowser.Navigate("Map.html")ます。これは現時点で正しく機能しています。しかし、私も知っていWebBrowser.InvokeScript()ます。これがJavaScript関数の実行に使用されているのを見てきましたが、次のような構造にしたいと思います:

APICalls.js - 呼び出すことができるさまざまな関数が含まれています。必要に応じて、関数ごとにファイルに分割することもできます。

MapInterface.cs

WebBrowser.InvokeScript("APICalls.js", args)- または、javascript 変数を直接制御します。

メソッドが使用されているのを見たことがありますInvokeScriptが、どの例にも関数のソースの詳細が記載されていないため、html ファイルまたは js ファイルから呼び出しているかどうかはわかりません。それぞれにjavascriptを使用してhtmlファイルを作成して使用するのではなく、このような構造、または同様に編成された構造を持つことは可能Navigate()ですか?

さらに、WPF で Google マップを使用する簡単な方法はありますか。調べてみたところ、見つけたすべてのリソースは少なくとも 2 ~ 3 年前のもので、maps API の最新バージョンより古いと思われます。

4

1 に答える 1

4

WPF で Google Maps API を使用するより良い方法を提案することはできませんが (存在することは確かですが)、質問の残りの部分に答えることができます。

  • まず、FEATURE_BROWSER_EMULATIONWebBrowser アプリを有効にして、Google Maps API がそれを最新の HTML5 対応ブラウザーとして認識できるようにします。

  • 次に、「Map.html」ページに移動し、読み込みを完了させます。を使用して実行する方法async/awaitを次に示します(コードは WinForms バージョンのWebBrowserコントロール用ですが、概念は同じままです)。

  • APICalls.js を個別のローカル ファイルとして保持できますが、<script>C# から要素を作成して設定する必要があります。セッション中に 1 回行います。

例:

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

[更新]もう少しモジュラーまたはオブジェクト指向のアプローチを探している場合はdynamic、C# の機能を利用できます。例:

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 に答える