2011-10-24 13 views
0

C#からWebブラウザコントロール内で実行されるjavascript関数によって返されるオブジェクトのプロパティにどうやってアクセスできるか知りたいと思います。私はJavaScriptライブラリのOpenStreetMapのオープン層に基づいてC#のマッピングコントロールを作成したいと思いますC#のwebbrowserコントロールで実行されているJavaスクリプトによって返されたオブジェクトへのアクセス

はここで完全なコンテキストです。 OSMマップは、webbrowser要素内に表示されるWebページに表示されます。私は、InvokeScriptを使用して、オープンレイヤライブラリ用の簡略化されたJavaスクリプトラッパーを呼び出して、マップを制御しています。すべてがうまくいきます。

C#ラッパーでは、現在Webブラウザコントロールの表示にある地図の中心座標を返す関数を実装したいと思います。これまで私はかなり不気味な解決策でしかなかった:

私のC#ラッパーでは、私はマップセンターを照会するために必要な2つの機能があります。 Javaスクリプトの機能は、C#経由を呼び出している

public Coord GetCenter() 
{ 
    object center = webBrowser.Document.InvokeScript("set_center_in_wrapper"); 

    // I'm stuck here: 
    Type type = center.GetType(); 
    PropertyInfo[] pi = type.GetProperties(); 

    // I already get the center as an object, but how can i access the 
    // properties "lon" and "lat" directly so that i can get rid of m_center 
    // and SetCenterFromJScript alltogether? 

    return m_center; 
} 

public void SetCenterFromJScript(double lon, double lat) 
{ 
    m_center.lon = lon; 
    m_center.lat = lat; 
} 

:最初に私は私のC#ラッパーにマップセンターを設定するために順番に別のC#の関数を呼び出すJavaScript関数(SetCenterFromJScript)を呼び出すためにInvokeScriptを使用していますGetCenterと呼ばれる機能を持っていますここに示されているようObjectForScriptingメカニズム:戻り値は無用である瞬間

function set_center_in_wrapper() 
{ 
    var center = map.getCenter().transform(new OpenLayers.Projection("EPSG:900913"), 
             new OpenLayers.Projection("EPSG:4326")) 

    window.external.SetCenterFromJScript(center.lon, center.lat); 
    return center // <- useless at the moment since i don't know how to access the data from C# 
} 

は、私は座標を提出するSetCenterFromJScriptを使用しています。どのように私はC#から中心のプロパティ "lon"と "lat"に直接アクセスできますか?

ご協力いただきありがとうございます。

答えて

0

InvokeMemberを使用してセンターのプロパティを取得してください。あなたはバインディングフラグをaroudnプレイする必要がある場合があります前に、私は、このシナリオでは、このコードをチェックしませんでした

object center = webBrowser.Document.InvokeScript("set_center_in_wrapper"); 
Type type = center.GetType(); 
Int32 lon = (Int32) type.InvokeMember("lon", 
      BindingFlags.DeclaredOnly | 
      BindingFlags.Public | BindingFlags.NonPublic | 
      BindingFlags.Instance | BindingFlags.GetField, null, center, null); 
Int32 lat = (Int32) type.InvokeMember("lat", 
      BindingFlags.DeclaredOnly | 
      BindingFlags.Public | BindingFlags.NonPublic | 
      BindingFlags.Instance | BindingFlags.GetField, null, center, null); 

:のようなもの。

+0

ありがとうございました!これはマイナーな変更で動作しています:私の場合は型が2倍で、BindingFlag.GetFieldの代わりにBindingFlags.GetPropertyを使用する必要があります。 –

関連する問題