2

当我向下滚动地图时,在某个位置它已经到达应用程序崩溃。它显示错误,因为值不在预期范围内

下面是我在 UWP 中的自定义渲染图。

public class CustomMapRenderer: MapRenderer
{
    MapControl nativeMap;
    List<CustomPin> customPins;
    MapOverlay mapOverlay;
    bool xamarinOverlayShown = false;
    private bool isMapLoaded;
    public BasicGeoposition NorthwestCorner { get; }
    public BasicGeoposition SoutheastCorner { get; }
    protected override void OnElementChanged(ElementChangedEventArgs<Map> e)
    {
        try
        {
            base.OnElementChanged(e);

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

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

                nativeMap.Loaded += ((sender, re) =>
                {
                    formsMap.MapLoaded();
                });

                nativeMap.Loading += (sender, args) =>
                {
                    var pin = MapViewModel.GetCurrentPin();

                    if (pin != null)
                        SetPins(pin);
                };

                formsMap.ClearPins = () =>
                {
                    if (nativeMap != null)
                    {
                        nativeMap.Children.Clear();
                        nativeMap.MapElements.Clear();
                    }
                };


                formsMap.LoadPins = Pins =>
                {
                    if (Pins != null)
                        foreach (var pin in Pins)
                        {
                            SetPins(pin);
                        }
                };
            }
        }
        catch (Exception ex)
        {
            LogTracking.LogTrace(ex.ToString());
        }
    }

    private void SetPins(CustomPin pin)
    {
        try
        {
            var snPosition = new BasicGeoposition { Latitude = pin.Pin.Position.Latitude, Longitude = pin.Pin.Position.Longitude };
            var snPoint=new Geopoint(snPosition);
            var mapIcon = new MapIcon();

            pin.ImageUrl = (pin.ImageUrl == null || pin.ImageUrl == string.Empty) ? "mapPin.png" : pin.ImageUrl;

            mapIcon.Image = RandomAccessStreamReference.CreateFromUri(new Uri(string.Format("ms-appx:///{0}", pin.ImageUrl)));
            mapIcon.CollisionBehaviorDesired = MapElementCollisionBehavior.RemainVisible;
            mapIcon.Location = snPoint;
            mapIcon.NormalizedAnchorPoint = new Windows.Foundation.Point(0.5, 1.0);

            mapOverlay = new MapOverlay(pin);
            MapControl.SetLocation(mapOverlay, snPoint);
            MapControl.SetNormalizedAnchorPoint(mapOverlay, new Windows.Foundation.Point(0.5, 1.0));
            xamarinOverlayShown = true;

            if (nativeMap != null)
            {
                nativeMap.Children.Add(mapOverlay);
                nativeMap.MapElements.Add(mapIcon);
            }
        }
        catch (Exception ex)
        {
            LogTracking.LogTrace(ex.ToString());
        }
    }
}
4

0 回答 0