#c# #javascript #webbrowser-control #openlayers #openstreetmap
#c# #javascript #webbrowser-control #openlayers #openstreetmap
Вопрос:
Я хотел бы знать, как я могу получить доступ к свойствам объекта, возвращаемого функцией javascript, выполняемой внутри элемента управления webbrowser из C #.
Вот полный контекст:
Я хотел бы создать элемент управления отображением C # на основе библиотеки JavaScript OpenStreetMap open layers. Карта OSM отображается на веб-странице, отображаемой внутри элемента webbrowser. Я использую InvokeScript для управления картой, вызывая упрощенную оболочку java script для библиотеки open layers. Все работает нормально.
В оболочке C # я хотел бы реализовать функцию, возвращающую координаты центра карты, отображаемой в данный момент в элементе управления webbrowser. До сих пор я придумал только довольно неэлегантное решение:
В моей оболочке 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 script вызывает C # через механизм 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 для отправки координат. Как я могу получить доступ к свойствам «lon» и «lat» center напрямую из C #?
Заранее спасибо, любая помощь приветствуется.
Ответ №1:
Попробуйте использовать 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);
Я раньше не проверял этот код в этом сценарии, поэтому вам может потребоваться поиграть с флагами привязки.
Комментарии:
1. Большое вам спасибо!. Это работает с незначительными изменениями: В моем случае тип double, и я должен использовать BindingFlags . getProperty вместо BindingFlag . getField .