访问由c#浏览器控件中运行的java脚本返回的对象
本文关键字:java 脚本 返回 对象 运行 浏览器 控件 访问 | 更新日期: 2023-09-27 18:12:21
我想知道我如何访问一个javascript函数返回的对象的属性从c#内的浏览器控件内运行。
下面是完整的上下文:
我想创建一个基于OpenStreetMap的开放图层javascript库的c#映射控件。OSM Map显示在webbrowser元素内的网页中。我使用InvokeScript是为了通过调用开放层库的简化java脚本包装器来控制映射。一切正常。
在c#包装器中,我想实现一个函数,返回当前在web浏览器控件中显示的地图的中心坐标。到目前为止,我只想出了一个相当不优雅的解决方案:在我的c#包装中,我有两个函数,我需要这两个函数来查询地图中心。首先,我有一个名为GetCenter的函数,它使用InvokeScript调用JavaScript函数,该函数反过来调用另一个c#函数(SetCenterFromJScript)来设置我的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;
}
Java脚本函数通过ObjectForScripting机制调用c#,如下所示:
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"answers"lat"?
提前感谢,任何帮助都是感激的。
尝试使用InvokeMember
获取中心的属性。比如:
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);
我之前没有在这个场景中检查这段代码,所以您可能需要使用绑定标志。