private void OnMapElementClick(MapControl sender, MapElementClickEventArgs e) { var mapIcon = e.MapElements.FirstOrDefault(x => x is MapIcon) as MapIcon; if (mapIcon != null) { if (!CustomPinControlShown) { var customPin = GetCustomPin(mapIcon.Location.Position); if (customPin == null) { throw new Exception("Custom pin not found"); } customPinControl = new CustomPinControl(customPin); var customPinControls = nativaMap.Children.Where(x => x is CustomPinControl); foreach (var control in customPinControls) { nativaMap.Children.Remove(control); } var snPosition = new BasicGeoposition() { Latitude = customPin.Position.Latitude, Longitude = customPin.Position.Longitude }; var snPoint = new Geopoint(snPosition); nativaMap.Children.Add(customPinControl); MapControl.SetLocation(customPinControl, snPoint); MapControl.SetNormalizedAnchorPoint(customPinControl, new Windows.Foundation.Point(0.5, 1.0)); CustomPinControlShown = true; } else { nativaMap.Children.Remove(customPinControl); CustomPinControlShown = false; } } }
protected override void OnElementChanged(ElementChangedEventArgs <Map> e) { base.OnElementChanged(e); if (e.OldElement != null) { nativaMap.MapElementClick -= OnMapElementClick; nativaMap.MapTapped -= NativaMap_MapTapped; nativaMap.Children.Clear(); customPinControl = null; nativaMap = null; } if (e.NewElement != null) { var formsMap = (CustomMap)e.NewElement; nativaMap = Control as MapControl; customPins = formsMap.CustomPins; nativaMap.Children.Clear(); nativaMap.MapElementClick += OnMapElementClick; nativaMap.MapTapped += NativaMap_MapTapped; if (customPins != null) { foreach (var pin in customPins) { var snPosition = new BasicGeoposition() { Latitude = pin.Position.Latitude, Longitude = pin.Position.Longitude }; var snPoint = new Geopoint(snPosition); var mapIcon = new MapIcon(); mapIcon.Location = snPoint; nativaMap.MapElements.Add(mapIcon); } } } }