技术开发 频道

C# 4.0中的动态类型与编程技巧

  6. 用C#代码控制Virtual Earth控件

  在Page类中添加如下代码控制Virtual Earth控件,以实现获取地图,添加Pin的功能:

dynamic map = null;
void GetMap()
{
map
= win.New.VEMap("myMap");
map.LoadMap();
}
void AddPin(Item item)
{
dynamic loc
= win.New.VELatLong(item.Latitude, item.Longitude);
var pin
= map.AddPushpin(loc);
pin.SetTitle(item.Title);
pin.SetDescription(item.Description);
map.SetCenterAndZoom(loc,
7);
}

  忆苦才能思甜。为了体会动态编程给我们带来的便利,我们来看看在没有动态类型的C# 3.0中,AddPin()函数应该如何实现。如果是在C# 3.0中,我们的doc,win和map 都将是静态类型,为了执行这些对象的某些方法,需要进行显式的类型转换,同时,还需要将方法名作为字符串传递以实现方法的调用。很明显,C# 3.0中的实现过程非常繁琐,而C# 4.0中的实现是如此的优雅而自然。

void AddPin(Item item)
{
ScriptObject loc
= win.CreateInstance("VELatLong", item.Latitude, item.Longitude);
ScriptObject pin
= (ScriptObject)map.Invoke("AddPushpin", loc);
pin.Invoke(
"SetTitle", item.Title);
pin.Invoke(
"SetDescription", item.Description);
map.Invoke(
"SetCenterAndZoom", loc, 7);
}

  最后,我们需要在适当的位置调用这两个函数,以实现地图的加载和Pin的添加。在Page类的Init()函数中添加GetMap()函数调用:

public void Init()
{
GetMap();
}

  另外,在lstPictures_SelectionChanged()函数中添加AddPin()函数,当用户选择的图片变化后,重新获取Pin的位置并添加到地图上:

void lstPictures_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Item selected
= lstPictures.SelectedItem as Item;
AddPin(selected);
}

  7. 编译解决方案

  到这里为止,我们对项目的修改就全部完成了。重新编译整个解决方案,我们可以看到添加Virtual Earth控件后的页面。当我们在左侧列表中选择图片后,Pin会定位到这幅图片拍摄的地点,当我们把鼠标移动到Pin上时,则会显示图片和更多的相关信息。

 

  图2 添加Virtual Earth控件后的页面

0
相关文章