/// <summary> /// Zoom map to a feature layer's extent. If its SR is different than the base map's, re-project the extent /// </summary> private void MenuItemZoomTo_Click(object sender, MenuItemClickEventArgs e) { HideConextMenu(); if (e.ItemTag is LivingMapLayer) { LivingMapLayer mapConfig = e.ItemTag as LivingMapLayer; Envelope extent = this.MapControl.Layers[mapConfig.ID].FullExtent; if (!SpatialReference.AreEqual(extent.SpatialReference, this.MapControl.SpatialReference, false)) { GeometryTool.ProjectEnvelope(this.AppConfig.GeometryService, extent, this.MapSRWKID, (s, g) => { if (g.ProjectedGeometry != null) { this.MapControl.ZoomTo(g.ProjectedGeometry); } }); } else { this.MapControl.ZoomTo(extent); } } else if (e.ItemTag is TOCNodeInfo) { TOCNodeInfo nodeInfo = e.ItemTag as TOCNodeInfo; if (nodeInfo.LayerExtent == null) { this.IsBusy = true; Layer layer = this.MapControl.Layers[nodeInfo.MapID]; string layerUrl = (nodeInfo.IsTiledMap) ? (layer as ArcGISTiledMapServiceLayer).Url : (layer as ArcGISDynamicMapServiceLayer).Url; ArcGISLayerInfoReader layerInfoReader = new ArcGISLayerInfoReader(layerUrl + "/" + nodeInfo.LayerID); layerInfoReader.InfoReady += (obj, arg) => { if (!SpatialReference.AreEqual(arg.LayerInfo.Extent.SpatialReference, this.MapControl.SpatialReference, false)) { GeometryTool.ProjectEnvelope(this.AppConfig.GeometryService, arg.LayerInfo.Extent, this.MapSRWKID, (s, g) => { this.IsBusy = false; if (g.ProjectedGeometry != null) { nodeInfo.LayerExtent = g.ProjectedGeometry as Envelope; this.MapControl.ZoomTo(nodeInfo.LayerExtent); } }); } else { this.IsBusy = false; nodeInfo.LayerExtent = nodeInfo.LayerExtent = arg.LayerInfo.Extent; this.MapControl.ZoomTo(nodeInfo.LayerExtent); } }; } else { this.MapControl.ZoomTo(nodeInfo.LayerExtent); } } }