private void OnMapElementClick(MapControl sender, MapElementClickEventArgs args)
        {
            try
            {
                var mapIcon = args.MapElements.FirstOrDefault(x => x is MapIcon) as MapIcon;
                if (mapIcon != null)
                {
                    if (!xamarinOverlayShown)
                    {
                        var customPin = GetCustomPin(mapIcon.Location.Position);
                        if (customPin == null)
                        {
                            throw new Exception("Custom pin not found");
                        }

                        if (customPin.Id == "Xamarin")
                        {
                            if (mapOverlay == null)
                            {
                                mapOverlay = new XamarinMapOverlay(customPin);
                            }

                            var snPosition =
                                new BasicGeoposition
                            {
                                Latitude  = customPin.Pin.Position.Latitude,
                                Longitude = customPin.Pin.Position.Longitude
                            };
                            var snPoint = new Geopoint(snPosition);

                            nativeMap.Children.Add(mapOverlay);
                            MapControl.SetLocation(mapOverlay, snPoint);
                            MapControl.SetNormalizedAnchorPoint(mapOverlay, new Windows.Foundation.Point(0.5, 1.0));
                            xamarinOverlayShown = true;
                        }
                    }
                    else
                    {
                        nativeMap.Children.Remove(mapOverlay);
                        xamarinOverlayShown = false;
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }
        protected override void OnElementChanged(ElementChangedEventArgs <Map> e)
        {
            try
            {
                base.OnElementChanged(e);

                if (e.OldElement != null)
                {
                    nativeMap.MapElementClick -= OnMapElementClick;
                    nativeMap.Children.Clear();
                    mapOverlay = null;
                    nativeMap  = null;
                }

                if (e.NewElement != null)
                {
                    var formsMap = (CustomMap)e.NewElement;
                    nativeMap  = Control as MapControl;
                    customPins = formsMap.CustomPins;

                    nativeMap.Children.Clear();
                    nativeMap.MapElementClick += OnMapElementClick;

                    foreach (var pin in customPins)
                    {
                        var snPosition =
                            new BasicGeoposition
                        {
                            Latitude  = pin.Pin.Position.Latitude,
                            Longitude = pin.Pin.Position.Longitude
                        };
                        var snPoint = new Geopoint(snPosition);

                        var mapIcon = new MapIcon();
                        mapIcon.Image = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///pin.png"));
                        mapIcon.CollisionBehaviorDesired = MapElementCollisionBehavior.RemainVisible;
                        mapIcon.Location = snPoint;
                        mapIcon.NormalizedAnchorPoint = new Windows.Foundation.Point(0.5, 1.0);

                        nativeMap.MapElements.Add(mapIcon);
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }