我在WebBrowser控件上使用InvokeScript尝试使用适用于HTML的Google Maps JavaScript API创建一个简单的地图。我在JavaScript的HTML页面中编写了一些函数来处理地图,我在C#中的WPF应用程序中复制了这些方法,并对它们进行了编辑,因此他们调用方法并执行他们需要做的与JavaScript接口的操作。
我遇到了问题,因为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。我怎么能这样做,谢谢?
答案 0 :(得分: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);
答案 1 :(得分: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已经翻了一倍。