在HTML中集成Ñ1*OowI-www.netcsharp.cn¯ívª¶||4在开始之前,我们先来简单看一下如何在HTML中集成Virtual Earth,大家可以去
这里查询相关APIs,我们来看看如何加载默认地图,如下代码所示:
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4<html>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <head>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <title></title>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <script type="text/javascript"Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1"></script>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <script type="text/javascript">Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 var map =
null;
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 function GetMap()
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 {
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 map =
new VEMap(
'myMap');
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 map.LoadMap();
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 }
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 </script>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 </head>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <body onload="GetMap();">Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <div id='myMap' style="position:
relative;
width:
480px;
height:
320px;
"></div>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 </body>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4</html>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4其实这段代码非常简单的简单,首先引入Virtual Earth Map控件,并且使用JavaScript来加载地图。
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4这是最简单的一个示例,但是并没有多大实用价值,下面我们再看一个如何在查找地图上的特定位置的示例,如下代码所示:
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4<html>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <head>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <title></title>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <script type="text/javascript"Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1"></script>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <script type="text/javascript">Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 var map =
null;
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 function GetMap()
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 {
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 map =
new VEMap(
'myMap');
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 map.LoadMap();
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 }
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 function FindLoc()
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 {
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 tryÑ1*OowI-www.netcsharp.cn¯ívª¶||4 {
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 var where = document.getElementById(
'txtWhere').value;
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 map.Find(
null, where);
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 }
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 catch(e)
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 {
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 alert(e.message);
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 }
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 }
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 </script>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 </head>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <body onload="GetMap();">Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <div id='myMap' style="position:
relative;
width:
500px;
height:
300px;
"></div>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <input id="txtWhere" type="text" name="txtWhere"/>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <input id="find" type="button" value="Find" name="find" onclick="FindLoc();"/>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 </body>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4</html>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4其实查找位置也特别简单,直接调用VEMap对象的Find()方法即可,运行后,查找“Beijing”如下图所示:
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4在Silverlight中集成通过上面的两个示例,大家看到了,在HTML中加载Virtual Earth都是使用JavaScript来完成,我们知道Silverlight 2应用程序可以很容易的实现与JavaScript的交互,意味着我们可以在Silverlight 2应用程序中通过调用JavaScript代码来实现集成,这种方式的确是可以的,但如果要编写非常复杂的Virtual Earth应用,实现起来也是一件不容易的事。
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4好在有一个开源项目可以帮助我们,使用托管代码在Silverlight 2中实现Virtual Earth应用。该项目名称为“Virtual Earth Wrapper for Silverlight”,官方地址:
http://www.codeplex.com/views,当前版本是1.1。该项目使用托管代码来封装了所有Virtual Earth中的JavaScript应用,使得我们编写Virtual Earth与Silverlight 2集成应用程序变得非常简单。下面我们看一个简单的示例,如何在Silverlight中加载Virtual Earth。
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4在下载Virtual Earth Wrapper for Silverlight后解压缩,会看到有两个程序集和一个JavaScript文件。首先在HTML中引入相关的JS脚本,如下代码所示:
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4<head>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <script type="text/javascript"Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1"></script>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <script type="text/javascript" src="views.js"></script>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4</head>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4其中views.js在压缩包里面有,然后添加一个div,用来作为地图容器:
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4<div id='mapContainer' style="position:
relative;
width:
500px;
height:
300px;
"></div>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4编写一段脚本,定义一个silverlight变量,该变量在此处虽然没有做任何事,但它将会在views.js文件中被运用:
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4<script type="text/javascript">Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 var silverlight =
null;
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 function pluginLoaded(sender,args)
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 {
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 silverlight = document.getElementById(
'Silverlight');
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 }
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4</script>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4编写Silverlight Object,指定onLoad事件,如下代码所示:
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4<div id="silverlightControlHost" style="position:
absolute;
width:
300px;
height:
480px;
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 left:
10px;
top:
320px;
z-index:
2">Ñ1*OowI-www.netcsharp.cn¯ívª¶||4<object data="data:application/x-silverlight," type="application/x-silverlight-2-b2"Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 style="width:5
00px;
height:
50px;
border-width:
0;
" id="Silverlight">Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <param name="onLoad" value="pluginLoaded" />Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <param name="source" value="ClientBin/SilverlightIntegrateVirtualEarth.xap"/>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 <param name="background" value="white" />Ñ1*OowI-www.netcsharp.cn¯ívª¶||4</object>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4</div>Ñ1*OowI-www.netcsharp.cn¯ívª¶||4现在来看Silverlight中的代码编写,首先引入ScriptInterop.dll和VIEWS.dll两个程序集,并引入相关的命名空间。在Page_Loaded事件中加入:
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4void Page_Loaded(
object sender,
RoutedEventArgs e){
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 VEMap map =
new VEMap(
"mapContainer");
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 HtmlPage.RegisterScriptableObject(
"SLMAP", map);
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 map.LoadMap();
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4}
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4代码非常简单,创建一个VEMap对象,这里的mapContainer就是我们刚才定义的地图容器,而SLMAP则是注册的对象别名,注意这个名称不能修改,因为在views.js中将会用到。现在运行后可以看到加载的地图:
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4现在我们再看一下如何在Silverlight中加入查找位置的功能,代码非常简单:
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4VEMap map;
void Page_Loaded(
object sender,
RoutedEventArgs e){
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 map =
new VEMap(
"mapContainer");
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 HtmlPage.RegisterScriptableObject(
"SLMAP", map);
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 map.LoadMap();
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4}
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4void btnFind_Click(
object sender,
RoutedEventArgs e){
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 map.Find(
null,
this.txtWhere.Text);
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4 map.LoadMap();
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4}
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4效果如下图所示:
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4除此之外,我们还可以开发更加复杂的应用,如添加层、实现3D效果等,下面是作者给出的一个示例效果:
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4
Ñ1*OowI-www.netcsharp.cn¯ívª¶||4附件:
SilverlightIntegrateVirtualEarth.zip