憶苦才能思甜。為了體會動態編程給我們帶來的便利,我們來看看在沒有動態類型的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控件後的頁面