2014-02-21 31 views
1

我使用WebBrowser控件InvokeScript嘗試和使用HTML的谷歌地圖的JavaScript API做一個簡單的地圖。我在JavaScript中的HTML頁面中編寫了幾個函數來處理地圖,並且我在C#中的WPF應用程序中複製了這些方法,並對它們進行了編輯,以便它們調用方法並執行他們需要做的與JavaScript接口。獲取JavaScript的自定義類型回到C#從InvokeScript與自定義類型結構保存

我有一個問題,因爲並不是所有由JavaScript返回的值都是簡單的,單值類型如字符串,整數或布爾值,並返回像LatLng這樣的自定義類型,我不知道如何「保留'返回的值作爲自定義類型的單獨'部分'。爲了幫助更多地解釋:

通常情況下,我可以使用下面的代碼:

return Convert.ToInt16(browser.InvokeScript("getHeading")); 

其中要求在JavaScript以下功能:

function GetHeading() { 
    return map.getHeading(); 
} 

和當前標題屬性返回一個整數值的地圖。這很容易,這沒有問題。但是一些函數具有自定義的返回類型。

LatLng類型由一個緯度值和一個經度值組成,所以它不能返回一個簡單的值,如果我用這篇文章的第一個代碼片段嘗試它,那麼它會拋出一個錯誤。對於如下所示的某些功能:

function GetCentre() { 
    return map.getCenter(); 
} 

返回一個LatLng,其中包含地圖中心的緯度和經度。我怎樣才能保存返回值,並保持它的緯度和經度然後將這個像這樣投入的自定義類型在C#:

public class LatLng 
{ 
    public string latitude { get; set } 
    public string longitude { get; set; } 
} 

我必須寫在JavaScript端兩個單獨的功能?:一個返回中心的緯度,另一個返回它的經度。基本上我想要做的是在WebBrowser控件上使用InvokeScript,調用返回自定義類型的javascript函數,並將該值保存在自定義類型中,然後我可以在C#中使用它,例如returnedValue.latitude和returnedValue.longitude。我怎麼能這樣做,謝謝?

回答

1

只需簡單的使用C#和.NET DLR dynamic功能,並返回JavaScript的結構如:

dynamic data = webBrowser1.Document.InvokeScript("eval", new[] { 
    "(function() { return { latitude: 1, longitude: 2 }; })()" }); 

MessageBox.Show("Data: " + data.latitude + ", " + data.longitude); 
0

正如Noseration說:

JavaScript : 

    function getCameraPosition() { 
     return map.getCenter().toJSON(); 
    } 

C# : 
    object[] o = new object[] {}; 
    dynamic res = googleMapWB.Document.InvokeScript("getCameraPosition", o); 
    Console.WriteLine(res.lat+","+res.lng); 

res.lat和res.lng已經在這種情況下是兩倍。