昨天做了个小功能,就是例子上的http://help.arcgis.com/en/webapi/silverlight/samples/start.htm#LayerList,也有些许不同,就是实现checkbox通过选中图层控制图层的可见性,图层是从xml文件读的,图层的属性绑定在listbox上,不多说了了先上代码:
图层类:LayerItem
View Code
1 /// <summary> 2 /// 图层ID 3 /// </summary> 4 public string ID 5 { 6 get; 7 set; 8 } 9 10 /// <summary> 11 /// 图层的标签 12 /// </summary> 13 public string Label 14 { 15 get; 16 set; 17 } 18 19 /// <summary> 20 /// 图层类型 21 /// </summary> 22 public LayerType Type 23 { 24 get; 25 set; 26 } 27 28 29 private string m_Url = string.Empty; 30 /// <summary> 31 /// 图层地址 32 /// </summary> 33 public string Url 34 { 35 get 36 { 37 m_Url = WebUtil.ReDirectDynamicUrl(m_Url, string.Empty); 38 return m_Url; 39 } 40 set { m_Url = value; } 41 }
地图控件:Map
View Code
1 <esri:Map x:Name="Map" IsLogoVisible="False" />
Listbox绑定图层类,自定义模板包括checkbox和textblock
View Code
1 <ListBox x:Name="MyList" ItemsSource="{Binding LayerItems}"> 2 <ListBox.ItemTemplate> 3 <DataTemplate> 4 <StackPanel Orientation="Horizontal"> 5 <!--Layer visibility checkbox--> 6 <CheckBox Click="CheckBox_Click" IsChecked="True"/> 7 <!--Layer name--> 8 <TextBlock Text="{Binding Label}"/> 9 </StackPanel> 10 </DataTemplate> 11 </ListBox.ItemTemplate> 12 </ListBox>
后台代码:
1.读xml
View Code
1 string sourceUrl = Application.Current.Host.Source.ToString(); 2 int removeIndex = sourceUrl.IndexOf("ClientBin"); 3 string configUrl = sourceUrl.Remove(removeIndex, sourceUrl.Length - removeIndex); 4 Uri configUri = new Uri(configUrl); 5 Uri url = new Uri(configUri + "ClientBin/Config.xml?" + Guid.NewGuid().ToString()); 6 WebClient webClient = new WebClient(); 7 webClient.OpenReadAsync(url); 8 webClient.OpenReadCompleted += ConfigLoadCompleted; 9 10 void ConfigLoadCompleted(object sender, OpenReadCompletedEventArgs e) 11 { 12 Stream stream = e.Result; 13 using (XmlReader xReader = XmlReader.Create(stream)) 14 { 15 XDocument document = XDocument.Load(xReader); 16 ConfigDoc = document; 17 //读取图层列表 18 var layers = from f in document.Descendants("Layer") 19 select new ZHPlatform.Layer.LayerItem 20 { 21 ID = f.Attribute("ID").Value, 22 Label = f.Attribute("Label").Value, 23 Url = f.Attribute("Url").Value, 24 Type = (LayerType)Enum.Parse(typeof(LayerType), f.Attribute("Type").Value, false), 25 SearchFields = f.Attribute("SearchFields").Value.Split(new char[] { ',' }).ToList(), 26 DisplayLabels = f.Attribute("DisplayLabel").Value.Split(new char[] { ',' }).ToList(), 27 KeyWord = f.Attribute("KeyWord").Value, 28 EditUrl = f.Attribute("EditUrl").Value, 29 IdentifyUrl = f.Attribute("IdentifyUrl").Value, 30 }; 31 if (layerItems == null) 32 layerItems = new List<LayerItem>(); 33 layerItems.AddRange(layers); 34 MyList.ItemsSource = layerItems; 35 Map.Layers = new ESRI.ArcGIS.Client.LayerCollection(); 36 37 foreach (LayerItem litem in layerItems) 38 { 39 ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer dynamicServiceLayer = new ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer(); 40 dynamicServiceLayer.Url = litem.Url; 41 dynamicServiceLayer.ID = litem.ID; 42 Map.Layers.Add(dynamicServiceLayer); 43 } 44 OnLoadConfigComplete(); 45 } 46 }
2.checkbox选中事件
View Code
1 private void CheckBox_Click(object sender, RoutedEventArgs e) 2 { 3 CheckBox tickedCheckBox = sender as CheckBox; 4 bool visible = (bool)tickedCheckBox.IsChecked; 5 LayerItem lyrItem = tickedCheckBox.DataContext as LayerItem; 6 ESRI.ArcGIS.Client.Layer lyr = Map.Layers[lyrItem.ID]; 7 if (lyr != null) 8 { 9 if (visible) 10 { 11 lyr.Visible = true; 12 } 13 else 14 { 15 lyr.Visible = false; 16 } 17 } 18 }
3.最后效果