A.2 layer is visble in map. But A.2 has been removed successfully on legend refreshed event
foreach (var pair in toDeletes) { var parentLayerItem = pair.Item1; var layerItemToDelete = pair.Item2; parentLayerItem.LayerItems.Remove(layerItemToDelete); Layer layer = parentLayerItem.Layer; int subID = layerItemToDelete.SubLayerID; if (layer is ISublayerVisibilitySupport && subID > 0)* (layer as ISublayerVisibilitySupport).SetLayerVisibility(subID, false); parentLayerItem.Layer.SetSublayerViisbility(layerItemToDelete.SublayerId, false); }
private void Legend_Refreshed(object sender, Legend.RefreshedEventArgs e) { List<string> removeLayers = new List<string> { "Service Agreement Areas", "HTE Routes", "Water 3-way", "Water 4-way", "Water 5-way", }; var toDeletes = LayerItem.GetAllParentChild().Where(pair => removeLayers.Contains(pair.Item2.Label)).ToArray(); foreach (var pair in toDeletes) pair.Item1.LayerItems.Remove(pair.Item2); }
IEnumerable<Tuple<LayerItemViewModel, LayerItemViewModel>> tupleParentChild; // declaration if (e.LayerItem.LayerItems != null) { foreach (LayerItemViewModel layerItemVM in e.LayerItem.LayerItems) { if (layerItemVM.IsGroupLayer) { composites.Add(layerItemVM); while (composites.Count > 0) { LayerItemViewModel layerItemVMGroup = composites[0]; foreach (LayerItemViewModel innerLayerItems in layerItemVMGroup.LayerItems) { if (innerLayerItems.IsGroupLayer == false) { innerLayerItems.IsExpanded = true; // Requirement : If strVisibleArray3D does not contains then remove the layer from Legend if (!strVisibleArray3D.Contains(innerLayerItems.Label)) { // dbroux method to get the parent child using legend extension method tupleParentChild = LegendExtension.GetAllParentChild(innerLayerItems); // issue always tupleParentChild has a pair of values but looping does not taking place foreach (var pair in tupleParentChild.ToArray()) { var parentLayerItem = pair.Item1; var layerItemToDelete = pair.Item2; parentLayerItem.LayerItems.Remove(layerItemToDelete); } } else { if (strPrefLayers.Contains(innerLayerItems.Label)) { innerLayerItems.IsEnabled = true; innerLayerItems.IsSelected = true; } } } else { composites.Add(innerLayerItems); } } composites.Remove(layerItemVMGroup); } } else { if (!strVisibleArray3D.Contains(layerItemVM.Label)) { // remove the layer } else { if (strPrefLayers.Contains(layerItemVM.Label)) { layerItemVM.IsEnabled = true; layerItemVM.IsSelected = true; } } } }
dbroux ,Thank you. I could able to get tuple pair of parent,child which I need to delete. But I do not understand second part, can you please explain in simple terms?.
foreach (var pair in toDeletes) { var parentLayerItem = pair.Item1; var layerItemToDelete = pair.Item2; parentLayerItem.LayerItems.Remove(layerItemToDelete); }
Basically I look for recursive loop logic to handle the case. I have seen another thread where dbroux provided sample for getting selecetd items but that does not help me.
public static class LegendExtensions{ // Go recursively through the LayerItems and return a tuple <parent, child> for each child public static IEnumerable<Tuple<LayerItemViewModel, LayerItemViewModel>> GetAllParentChild(this LayerItemViewModel layerItem) { return layerItem == null || layerItem.LayerItems == null ? Enumerable.Empty<Tuple<LayerItemViewModel, LayerItemViewModel>>() : layerItem.LayerItems.SelectMany(child => new[] { new Tuple<LayerItemViewModel, LayerItemViewModel>(layerItem, child) }.Concat(GetAllParentChild(child))); } }
var toDeletes = LayerItem.GetAllParentChild().Where(pair => new[] {"Service Agreement Areas", "HTE Routes", ....}.Contains(pair.Item2.Label)).ToArray(); foreach (var pair in toDeletes) pair.Item1.LayerItems.Remove(pair.Item2);
private void Legend_Refreshed(object sender, Legend.RefreshedEventArgs e) { List<LayerItemViewModel> removeLayerItemVM = new List<LayerItemViewModel>(); List<LayerItemViewModel> removeLayerItemVM2 = new List<LayerItemViewModel>(); List<string> removeLayers = new List<string>(); removeLayers.Add("Service Agreement Areas"); removeLayers.Add("HTE Routes"); removeLayers.Add("Water 3-way"); removeLayers.Add("Water 4-way"); removeLayers.Add("Water 5-way"); removeLayers.Add("Water 6-way"); if (e.LayerItem.LayerItems != null) { foreach (LayerItemViewModel layerItemVM in e.LayerItem.LayerItems) { //removes the feature layers in the water group layer from the legend: foreach (LayerItemViewModel livm in layerItemVM.LayerItems) { foreach (string rlayer in removeLayers) { if (livm.Label == rlayer) removeLayerItemVM2.Add(livm); } } foreach (LayerItemViewModel rlivm in removeLayerItemVM2) { layerItemVM.LayerItems.Remove(rlivm); } //collapses all the legend items: if (layerItemVM.IsExpanded == true) { layerItemVM.IsExpanded = false; for (int i = 0; i < layerItemVM.LayerItems.Count; i++) { layerItemVM.LayerItems.IsExpanded = false; } } //removes all the other group layers from the legend: if (layerItemVM.Label == "General Layers") removeLayerItemVM.Add(layerItemVM); else if (layerItemVM.Label == "Storm Layers") removeLayerItemVM.Add(layerItemVM); else if (layerItemVM.Label == "Sewer Layers") removeLayerItemVM.Add(layerItemVM); } foreach (LayerItemViewModel remLayerItemVM in removeLayerItemVM) { e.LayerItem.LayerItems.Remove(remLayerItemVM); } } else { e.LayerItem.IsExpanded = false; } }
Angemeldete Mitglieder können Beiträge verfassen, Updates folgen und mehr. Neu hier? Registriere ein kostenloses Konto.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.