在应用程序的集成过程中,有时候需要WinForm应用程序和Javascript程序进行交互。比如说:应用程序是一个综合调度系统,在整个综合调度系统中,要实现定位,显示地图。综合调度平台的大部分功能都是使用WinForm实现的;但是定位和地图部分都不是自己开发的需要使用第三方接口,实现地图的展示,而第三方的接口使用的是Javascript实现的。这种情况有一下两种方法解决:
1,浏览器显示地图,WinForm实现综合调度台的其他功能,使用socket通信方式或者其他方式实现web浏览器和综合调度台之间的一种交互。
2,使用WinForm的JS之间的直接交互。
以上两种方法:第一种方法明显的缺点就是整个综合调度台的风格不一致,而且在开发过程中,调试麻烦,调试过程受网络的影响较大。第二种方法却从根本上克服了以上所有缺点。
如何实现WinForm和Javascript之间的交互成为解决这个问题的核心问题。所谓交互就是WinForm的应用程序能够调用Javascript的程序接口,同时JS的程序也能够调用WinForm的应用程序接口。
这里用百度地图API做个例子:
(1)首先创建一个网页命名为:myMap.html 假设该网页的路径为:D://myMap.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>百度地图的Hello, World</title>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=1.2&services=true"></script>
</head>
<body>
<div style="width: 600px; height: 400px" id="container"></div>
</body>
</html>
<script type="text/javascript">
function myMap(x,y) {
var map = new BMap.Map("container"); // 创建Map实例
var point = new BMap.Point(x, y);// 创建点坐标
map.centerAndZoom(point, 15); // 初始化地图,设置中心点坐标和地图级别。
}
</script>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>百度地图的Hello, World</title>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=1.2&services=true"></script>
</head>
<body>
<div style="width: 600px; height: 400px" id="container"></div>
</body>
</html>
<script type="text/javascript">
function myMap(x,y) {
var map = new BMap.Map("container"); // 创建Map实例
var point = new BMap.Point(x, y);// 创建点坐标
map.centerAndZoom(point, 15); // 初始化地图,设置中心点坐标和地图级别。
}
</script>
(2)创建一个WinForm应用程序,在应用程序窗体上添加一个浏览器控件:webBrowser1
(3)在WinForm的窗体Form1中添加一个button按钮。Button1用来测试调用JS事件。
后台代码如下:
注意: 类定义前需要加上下面两行,否则调用失败!并且要在project中添加System.Security的引用
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 using System.Security.Permissions;
10
11 namespace WindowsFormsApplication1
12 {
13 [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
14 [System.Runtime.InteropServices.ComVisibleAttribute(true)]
15
16 public partial class Form1 : Form
17 {
18 public Form1()
19 {
20 InitializeComponent();
21 this.webBrowser1.Url = new Uri(@"D:\myMap.htm");
22 webBrowser1.ObjectForScripting = this;
23 }
24
25 private void button1_Click(object sender, EventArgs e)
26 {
27 webBrowser1.Document.InvokeScript("myMap", new object[]{ 121.479922,31.2391 });
28 }
29 }
30 }
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 using System.Security.Permissions;
10
11 namespace WindowsFormsApplication1
12 {
13 [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
14 [System.Runtime.InteropServices.ComVisibleAttribute(true)]
15
16 public partial class Form1 : Form
17 {
18 public Form1()
19 {
20 InitializeComponent();
21 this.webBrowser1.Url = new Uri(@"D:\myMap.htm");
22 webBrowser1.ObjectForScripting = this;
23 }
24
25 private void button1_Click(object sender, EventArgs e)
26 {
27 webBrowser1.Document.InvokeScript("myMap", new object[]{ 121.479922,31.2391 });
28 }
29 }
30 }