从WPF中的Web浏览器调用HTML页面中存在的JavaScript函数

Mah*_*esh 3 javascript browser wpf google-maps wpf-controls

我是WPF的新手.我在我的wpf应用程序中使用"WebBroswer"来渲染Google地图.我有一个googlemap.htm页面,它包含一个初始化(lat,log)JavaScript函数.现在我想从带有lat和log参数的.xaml.cs文件中调用此函数.

Googlemap.htm

 <script>
        function initialize(lat, log) {
            var mapProp = {
                center: new google.maps.LatLng(lat, log),
                zoom: 5,
                mapTypeId: google.maps.MapTypeId.ROADMAP
            };
            var map = new google.maps.Map(document.getElementById("googleMap"), mapProp);
        }
        google.maps.event.addDomListener(window, 'load', initialize);
    </script>
Run Code Online (Sandbox Code Playgroud)

SHS*_*HSE 6

最简单的方法是使用WebBrowser.InvokeScript方法:

 this.WebBrowser.InvokeScript("initialize", 1, 2);
Run Code Online (Sandbox Code Playgroud)

或者你也可以像这样重写你的JavaScript代码:

 function initialize(lat, log) {
    var mapProp = {
       center: new google.maps.LatLng(lat, log),
       zoom: 5,
       mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("googleMap"), mapProp);
 }

 document.myfunc = initialize; // expose it to the document scope

 google.maps.event.addDomListener(window, 'load', initialize);
Run Code Online (Sandbox Code Playgroud)

所以现在你可以myfunc从C#代码访问:

private void WebBrowser_OnLoadCompleted(object sender, NavigationEventArgs e)
{
    dynamic document = WebBrowser.Document;

    document.myfunc(1, 2);
}
Run Code Online (Sandbox Code Playgroud)

你也可以myfunc不用dynamic关键字调用:

private void WebBrowser_OnLoadCompleted(object sender, NavigationEventArgs e)
{    
   var document = this.WebBrowser.Document;

   document.GetType().InvokeMember("myfunc", BindingFlags.InvokeMethod, null, document, new object[] {1, 2});
}
Run Code Online (Sandbox Code Playgroud)