|
4. 添加对HTML DOM对象的动态访问 public partial class Page : UserControl
{ // 添加的代码 dynamic doc = HtmlPage.Document.AsDynamic(); dynamic win = HtmlPage.Window.AsDynamic(); //… } 然后,我们修改Page类的函数btnSearch_Click(),当用户点击”Get All”按钮后,更加用户搜索的内容,修改窗口的标题。 void btnSearch_Click(object sender, RoutedEventArgs e)
{ doc.Title = "Pictures of " + txtTag.Text; lstPictures.ItemsSource = Source.LoadItems(); } 5. 添加Virtual Earth Jscript控件 <script type="text/javascript" src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1"/>
然后,在<body>标签中添加如下代码,定义地图控件的位置和大小: <div id='myMap' style="position:absolute; top:40px; left:200px; width:550px; height:400px;"/>
通过简单的两步,我们就完成了对测试页面的修改。接下来的工作就是通过C#访问和控制Virtual Earth控件了。 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. 编译解决方案
![]() 图2 添加Virtual Earth控件后的页面
|






骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价