ThinkGeo.com    |     Documentation    |     Premium Support

Map Location from Context Menu

Hi,


I would like to place a right click context menu on the map control and send the clicked coordinates (the map location where the user right clicked) as an argument to the different subroutines called by the context menu.   Seems simple but I can't figure it out.  Any help would be great!!


Brad



1. Hook up to the map's mouse click event.


2. In your MapClicked event handler, grab the current mouse position from the MapClickedWpfMapEventArg.


3. Still in your event handler, determine if this was a right mouse click and programmatically create your context menu.  Since you are programmatically creating context menu, you can pass it the current position.  After creating menu, set IsOpen to true to show it on the map.


4. You can also create the ContextMenu in XAML  on the map but I chose to do this programmatically as my context menus depends on the feature clicked.



Hello Klaus, 
  
 Thanks for your valuable experience and share. 
  
 Brad, let us know if you still have the queries. 
  
 Regards, 
  
 Gary

Thanks Klaus.  The problem with this approach is that when I right click on a marker to bring up the marker contextmenu, this context menu opens too.   Any solution to that problem? 
  
 Thanks!

If you hook to the map's ContextMenuOpening event and set e.Handled = true, will this suppress the marker's context menu?


This is what I am doing in the event handler for the map's ContextMenuOpening event.  Here contextMenuController is what dynamically creates my context menu.



 



map.ContextMenuOpening += MapContextMenuOpening;
 void MapContextMenuOpening(object sender, ContextMenuEventArgs e)
        {
            e.Handled = true;
            contextMenuController.OnMapContextMenuOpening(sender, e);
        }


 



Yes, setting e.Handled=true will supress the marker context menu.  However, when the user right clicks on a marker I want to show the marker menu.  When they right click anywhere else on the map I want to show the dynamically generated context menu.   
  
 If I had some way to tell that the context menu event source was a marke then I could use that and show the correct menu, but I can’t figure out how to tell if the user right clicked on a marker or another area of the map??? 
  
 Really all I need are the world coordinates when the user clicks some area of the map other than a marker.  I want a context menu that allows them to zoom to that location or create a marker at that location.  Perhaps there is an easier way to do this?

 Hello Brad,


 
Please have a look this code, if you are using marker in InMemoryFeatureLayer, you can use this code directly, if not you still can refer this code to get some idea, the key part is using buffer to get the mouse click area.

private void winformsMap1_MapClick(object sender, MapClickWinformsMapEventArgs e)
        {
            LayerOverlay markerOverlay = (LayerOverlay)winformsMap1.Overlays["MarkerOverlay"];
            InMemoryFeatureLayer inmemoryFeatureLayer = markerOverlay.Layers[0] as InMemoryFeatureLayer;

            MultipolygonShape buffer = e.WorldLocation.Buffer(350, GeographyUnit.DecimalDegree, DistanceUnit.Kilometer);

            Collection<Feature> clickedMarker = inmemoryFeatureLayer.QueryTools.GetFeaturesWithin(buffer, ReturningColumnsType.NoColumns);
            if (clickedMarker.Count > 0)
            {
                Collection<Feature> features = winformsMap1.FindFeatureLayer("SelectedPOILayer ").FeatureSource.GetFeaturesNearestTo(new PointShape(e.WorldLocation.X, e.WorldLocation.Y), GeographyUnit.DecimalDegree, 10, ReturningColumnsType.AllColumns);
                Feature selectedFeature;
                foreach (Feature feature in features)
                {
                    if (feature.GetWellKnownType() == WellKnownType.Line || feature.GetWellKnownType() == WellKnownType.Multiline)
                    {
                        selectedFeature = feature;
                        break;
                    }
                }
                //selectedFeature is what you want, do anything you want to do, like hight it, change the color, show some tooltip.
            }
        }

Regards,
 
Gary