using System; using System.Collections.Generic; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media.Imaging; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.WpfDesktopEdition; namespace MovingMarker { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void WpfMap_Loaded(object sender, RoutedEventArgs e) { wpfMap1.MapUnit = GeographyUnit.DecimalDegree; wpfMap1.CurrentExtent = new RectangleShape(-155.733, 95.60, 104.42, -81.9); WorldMapKitWmsWpfOverlay worldMapKitOverlay = new WorldMapKitWmsWpfOverlay(); wpfMap1.Overlays.Add(worldMapKitOverlay); SimpleMarkerOverlay markerOverlay = new SimpleMarkerOverlay(); markerOverlay.DragMode = MarkerDragMode.Drag; markerOverlay.MarkerDragged += new EventHandler(markerOverlay_MarkerDragged); wpfMap1.Overlays.Add("MarkerOverlay", markerOverlay); inmLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.Capital1; inmLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; ov.Layers.Add(inmLayer); wpfMap1.Overlays.Add(ov); wpfMap1.Refresh(); } InMemoryFeatureLayer inmLayer = new InMemoryFeatureLayer(); LayerOverlay ov = new LayerOverlay(); void markerOverlay_MarkerDragged(object sender, MarkerDraggedSimpleMarkerOverlayEventArgs e) { inmLayer.InternalFeatures.Add(new Feature(e.DraggingMarker.Position.X, e.DraggingMarker.Position.Y)); wpfMap1.Refresh(ov); } private void wpfMap1_MapClick(object sender, MapClickWpfMapEventArgs e) { if (e.MouseButton != MapMouseButton.Left) return; SimpleMarkerOverlay markerOverlay = (SimpleMarkerOverlay)wpfMap1.Overlays["MarkerOverlay"]; AddPictureMarkerToOverlay(e.WorldLocation, markerOverlay); markerOverlay.Refresh(); } private void OnMarkerPreviewMouseRightButtonUp(object sender, MouseButtonEventArgs e) { ((Marker)sender).ContextMenu.IsOpen = true; } private void AddPictureMarkerToOverlay(PointShape point, SimpleMarkerOverlay markerOverlay) { List markers = new List(); for (var i = 0; i < 5; i++) { markers.Add(CreateMarker(new PointShape(point.X + i, point.Y + i))); } foreach (var marker in markers) { markerOverlay.Markers.Add(marker); } } private Marker CreateMarker(PointShape point) { Marker marker = new Marker(point); marker.ImageSource = new BitmapImage(new Uri("/Resources/AQUA.png", UriKind.RelativeOrAbsolute)); marker.Width = 32; marker.Height = 32; marker.YOffset = -17; CompleteMarkerSetup(marker); return marker; } private void CompleteMarkerSetup(Marker marker) { var contextMenu = new ContextMenu(); var menuItem = new MenuItem(); menuItem.Header = "Remove"; menuItem.Name = "Marker" + marker.GetHashCode().ToString(); menuItem.Click += OnRemoveMarkerRequested; contextMenu.Items.Add(menuItem); marker.ContextMenu = contextMenu; marker.Name = menuItem.Name; marker.PreviewMouseRightButtonUp += OnMarkerPreviewMouseRightButtonUp; } private void OnRemoveMarkerRequested(object sender, RoutedEventArgs e) { var menuItem = (MenuItem)e.Source; menuItem.Click -= OnRemoveMarkerRequested; var markerName = ((MenuItem)e.Source).Name; var markerOverlay = (SimpleMarkerOverlay)wpfMap1.Overlays["MarkerOverlay"]; markerOverlay.Markers.Remove(markerName); markerOverlay.Refresh(); } } }