void CenterOnUsersLocation(object sender, EventArgs e)
 {
     if (NativeMapView.UserLocation.Location != null)
     {
         CLLocationCoordinate2D coords = NativeMapView.UserLocation.Coordinate;
         MKCoordinateRegion     region = MKCoordinateRegion.FromDistance(coords, 2000, 2000);
         NativeMapView.SetRegion(region, true);
     }
     else
     {
         centerOnUserRequested = true;
     }
 }
        void CalculateRouteDetails(bool zoomMapToShowFullRoute = true, bool requestAlternateRoutes = true, MKDirectionsTransportType transportType = MKDirectionsTransportType.Automobile)
        {
            MKDirectionsRequest directionRequest = new MKDirectionsRequest();

            directionRequest.Source                  = sourceMapItem;
            directionRequest.Destination             = destinationMapItem;
            directionRequest.RequestsAlternateRoutes = requestAlternateRoutes;
            directionRequest.TransportType           = transportType;

            MKDirections eta = new MKDirections(directionRequest);

            eta.CalculateETA((MKETAResponse response, Foundation.NSError error) =>
            {
                if (error != null)
                {
                    System.Diagnostics.Debug.WriteLine(error.Description);
                }
                else
                {
                    TimeSpan time = TimeSpan.FromSeconds(response.ExpectedTravelTime);
                    System.Diagnostics.Debug.WriteLine(time.ToString(@"hh\:mm\:ss\:fff"));
                }
            });

            MKDirections directions = new MKDirections(directionRequest);


            directions.CalculateDirections((MKDirectionsResponse response, Foundation.NSError error) =>
            {
                if (error != null)
                {
                    System.Diagnostics.Debug.WriteLine(error.Description);
                }
                else
                {
                    //remove previous route overlays
                    ClearOverlays();

                    currentRouteOverlay = response.Routes[0].Polyline;

                    MKRoute route;

                    //loop through backwards so first most route is renderered on top
                    for (int i = response.Routes.Length - 1; i >= 0; i--)
                    {
                        route = response.Routes[i];

                        //save overlay so it can be removed later if requested
                        overlaysList.Add(route.Polyline);

                        NativeMapView.AddOverlay(route.Polyline, MKOverlayLevel.AboveRoads);

                        if (i == 0)
                        {
                            if (zoomMapToShowFullRoute)
                            {
                                MKMapRect rect         = route.Polyline.BoundingMapRect;
                                MKMapRect expandedRect = NativeMapView.MapRectThatFits(rect, new UIEdgeInsets(20, 20, 20, 20));

                                NativeMapView.SetRegion(MKCoordinateRegion.FromMapRect(expandedRect), true);
                            }
                        }
                    }
                }
            });
        }