#region 處理工程點點擊編輯相關事件 public Graphic editgraphics = null; //待編輯的Graphics圖層 public Graphic oldgraphics = null; //原先Graphics圖層 public Symbol symbolold = null; /// <summary> /// 在地圖上點擊編輯點處理事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void myMap_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { ESRI.ArcGIS.Client.Projection.WebMercator mercator = new ESRI.ArcGIS.Client.Projection.WebMercator(); try { if (editgraphics != null) { if (isedit) { System.Windows.Point screenPoint = e.GetPosition(myMap); ESRI.ArcGIS.Client.Geometry.MapPoint mapPoint = myMap.ScreenToMap(screenPoint); double x = Math.Round(mapPoint.X, 4); double y = Math.Round(mapPoint.Y, 4); MapPoint mp = new MapPoint(x, y); editgraphics.Geometry = mp; } else { editgraphics = oldgraphics; } } else { } } catch (Exception) { return; } } void graphic_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Graphic graphic = sender as Graphic; oldgraphics = graphic; //儲存原先的Graphics圖層 isedit = true; //選工程點 if (graphic != null) { //將上一個圖元還原第一個圖元 if (symbolold != null) { editgraphics.Symbol = symbolold; } editgraphics = graphic; symbolold = editgraphics.Symbol; editgraphics.Symbol = ((SimpleMarkerSymbol)this.FindName("SimpleSymbol")); ESRI.ArcGIS.Client.Geometry.MapPoint mp = (MapPoint)graphic.Geometry; ESRI.ArcGIS.Client.Projection.WebMercator mercator = new ESRI.ArcGIS.Client.Projection.WebMercator(); mp = WKIDConvert.mercator2lonlat(ESRI.ArcGIS.Client.Geometry.Geometry.NormalizeCentralMeridian(mp) as ESRI.ArcGIS.Client.Geometry.MapPoint); //開啟Tab進行編輯操作 this.gridTab2.Width = new GridLength(278, GridUnitType.Pixel); tbTip1.Text = "<<"; string title = graphic.Attributes["NAME"].ToString(); //工程名稱 this.tbProjectName.Text = title; this.tbLatitute.Text = Math.Round(mp.X, 4).ToString(); //經度 this.tbLongitute.Text = Math.Round(mp.Y, 4).ToString(); //緯度 } } void graphic_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { Graphic graphic = sender as Graphic; editgraphics.Symbol = ((SimpleMarkerSymbol)this.FindName("SimpleSymbol")); ESRI.ArcGIS.Client.Geometry.MapPoint mp = (MapPoint)graphic.Geometry; ESRI.ArcGIS.Client.Projection.WebMercator mercator = new ESRI.ArcGIS.Client.Projection.WebMercator(); mp = WKIDConvert.mercator2lonlat(ESRI.ArcGIS.Client.Geometry.Geometry.NormalizeCentralMeridian(mp) as ESRI.ArcGIS.Client.Geometry.MapPoint); string title = graphic.Attributes["NAME"].ToString(); //工程名稱 this.tbProjectName.Text = title; this.tblEditName.Text = title; this.tbLatitute.Text = Math.Round(mp.X, 4).ToString(); //經度 this.tbLongitute.Text = Math.Round(mp.Y, 4).ToString(); //緯度 } void graphic_MouseMove(object sender, MouseEventArgs e) { Graphic graphic = sender as Graphic; Grid grid = new Grid(); grid.Background = new SolidColorBrush(Colors.Blue); TextBlock msg = new TextBlock(); msg.Foreground = new SolidColorBrush(Colors.White); msg.FontSize = 13; msg.FontFamily = new FontFamily("Microsoft YaHei"); msg.Text = graphic.Attributes["NAME"].ToString(); grid.Children.Add(msg); graphic.MapTip = grid; } RichTextBox rtb; void graphic_MouseRightButtonUp(object sender, MouseButtonEventArgs e) { if (isedit) { //只有在選中點開始編輯後,才可以取消編輯 RTBContextMenu menu = new RTBContextMenu(rtb, this); menu.Show(e.GetPosition(LayoutRoot)); } else { //什麼也不執行 } } void graphic_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { e.Handled = true; } private void btnModify_Click(object sender, System.Windows.RoutedEventArgs e) { try { if (string.IsNullOrEmpty(this.tbProjectName.Text)) { MessageBox.Show("請先選擇一個工程點!"); } else { MapPoint mp = (MapPoint)editgraphics.Geometry; getDataSoapClient client = new getDataSoapClient(); client.updagePositionCompleted += new EventHandler<AsyncCompletedEventArgs>(client_updagePositionCompleted); MapPoint mapPoint = WKIDConvert.mercator2lonlat(ESRI.ArcGIS.Client.Geometry.Geometry.NormalizeCentralMeridian(mp) as ESRI.ArcGIS.Client.Geometry.MapPoint); client.updagePositionAsync(this.tbProjectName.Text, Math.Round(mapPoint.X, 4).ToString(), Math.Round(mapPoint.Y, 4).ToString()); } } catch (Exception) { MessageBox.Show("請先選擇一個工程點!"); } } void client_updagePositionCompleted(object sender, AsyncCompletedEventArgs e) { //重新載入資料,這裡需要維持地圖縮放的比例 ESRI.ArcGIS.Client.Projection.WebMercator mercator = new ESRI.ArcGIS.Client.Projection.WebMercator(); ESRI.ArcGIS.Client.Geometry.Envelope selectedFeatureExtent = mercator.ToGeographic(editgraphics.Geometry).Extent; //選中點的位置 double expandPercentage = 10; //加數值後,聚焦(這裡需要注意,進行地理座標和墨卡托座標的轉換) double widthExpand = (selectedFeatureExtent.Width + 5) * (expandPercentage / 100); double heightExpand = (selectedFeatureExtent.Height + 5) * (expandPercentage / 100); ESRI.ArcGIS.Client.Geometry.Envelope displayExtent = new Envelope(WKIDConvert.lonlat2mercator(new MapPoint(selectedFeatureExtent.XMin - (widthExpand / 2), selectedFeatureExtent.YMin - (heightExpand / 2))), WKIDConvert.lonlat2mercator(new MapPoint(selectedFeatureExtent.XMax + (widthExpand / 2), selectedFeatureExtent.YMax + (heightExpand / 2)))) { SpatialReference = new SpatialReference(102100) }; MessageBox.Show("工程位置更新成功!"); //重新載入地圖 GetGCInfoByType(tip_Base.CurrentValue); //重新置文本輸入框為空白 this.tbProjectName.Text = ""; this.tbLatitute.Text = ""; this.tbLongitute.Text = ""; } #endregion using System;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using System.Windows.Media.Imaging;using System.Windows.Media.Effects;using ESRI.ArcGIS.Client.FeatureService.Symbols;using ESRI.ArcGIS.Client.Geometry;namespace MapClient.CommonClass{ public class RTBContextMenu : ContextMenu { RichTextBox rtb; GCSiteM _gcSite; public RTBContextMenu(RichTextBox rtb, GCSiteM gcSite) { this.rtb = rtb; _gcSite = gcSite; } //構造功能表按鈕並返回一個FrameworkElement對象 protected override FrameworkElement GetContent() { Border border = new Border() { BorderBrush = new SolidColorBrush(Color.FromArgb(255, 167, 171, 176)), BorderThickness = new Thickness(1), Background = new SolidColorBrush(Colors.White) }; border.Effect = new DropShadowEffect() { BlurRadius = 3, Color = Color.FromArgb(255, 230, 227, 236) }; //取消選中 Button tjspButton = new Button() { Height = 22, Margin = new Thickness(0, 0, 0, 0), HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Top, HorizontalContentAlignment = HorizontalAlignment.Left }; tjspButton.Style = Application.Current.Resources["ContextMenuButton"] as Style; tjspButton.Click += new RoutedEventHandler(tjspButton_Click); tjspButton.Content = "取消選中"; border.Child = tjspButton; return border; } void tjspButton_Click(object sender, RoutedEventArgs e) { //恢複原來的顏色 _gcSite.editgraphics.Symbol = new SimpleMarkerSymbol() { Color = new SolidColorBrush(ColorRevert.ToColor("#FF0551A7")), Size = 10, Style = ESRI.ArcGIS.Client.FeatureService.Symbols.SimpleMarkerSymbol.SimpleMarkerStyle.Circle }; _gcSite.isedit = false; //重新載入資料,這裡需要維持地圖縮放的比例 ESRI.ArcGIS.Client.Projection.WebMercator mercator = new ESRI.ArcGIS.Client.Projection.WebMercator(); ESRI.ArcGIS.Client.Geometry.Envelope selectedFeatureExtent = mercator.ToGeographic(_gcSite.oldgraphics.Geometry).Extent; //原先選中點的位置 double expandPercentage = 10; //加數值後,聚焦(這裡需要注意,進行地理座標和墨卡托座標的轉換) double widthExpand = (selectedFeatureExtent.Width + 5) * (expandPercentage / 100); double heightExpand = (selectedFeatureExtent.Height + 5) * (expandPercentage / 100); ESRI.ArcGIS.Client.Geometry.Envelope displayExt http:// ent = new Envelope(WKIDConvert.lonlat2mercator(new MapPoint(selectedFeatureExtent.XMin - (widthExpand / 2), selectedFeatureExtent.YMin - (heightExpand / 2))), WKIDConvert.lonlat2mercator(new MapPoint(selectedFeatureExtent.XMax + (widthExpand / 2), selectedFeatureExtent.YMax + (heightExpand / 2)))) { SpatialReference = new SpatialReference(102100) }; //重新載入地圖 _gcSite.GetGCInfoByType(tip_Base.CurrentValue); //重新置文本輸入框為空白 _gcSite.tbProjectName.Text = ""; _gcSite.tbLatitute.Text = ""; _gcSite.tbLongitute.Text = ""; Close(); } }}
以上使用到的右鍵菜單功能ContextMenu.cs類請參考:http://blog.csdn.net/taomanman/article/details/7333612