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();
}
}
}