如何在 Xamarin Forms Maps 上添加多个不同的自定义图标?

How to add multiple different custom icons on Xamarin Forms Maps?

我正在尝试使用多个不同的自定义地图图钉渲染地图。

我已按照此处提供的文档将所有图标替换为自定义图标:

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/custom-renderer/map-pin

但是我希望实现的是根据我的 CustomPin class 的 属性 值更改图标,问题似乎在于渲染我的地图时,标记已创建,但我的 CustomPin 列表仍然为“空”,我试图找到更多关于基于自定义 属性 的多个图标的文档或答案,但没有成功。

任何人都可以在正确的方向上推动我吗?

代码片段,目前无法正常工作:

自定义引脚

    public class CustomPin : Pin
    {
        public string IconType { get; set; }
    }

自定义地图

     public class CustomMap : Map
    {
        public List<CustomPin> CustomPins { get; set; }
    }

MapPage.xaml.cs(填充引脚列表 => IconType 是我的自定义 属性 以检查要呈现的图标)

    private void DisplayOnMap(IList<Models.Location> pins)
        {
            List<CustomPin> CustomPins = new List<CustomPin>();
            foreach (var item in pins)
            {
                try
                {
                    var position = new Xamarin.Forms.Maps.Position(item.lat, item.lon);
                    var pin = new CustomPin()
                    {
                        Type = Xamarin.Forms.Maps.PinType.Generic,
                        Position = position,
                        Label = item.naam,
                        Address = $"{item.straat} {item.nummer}, {item.postnr} {item.stad} ({item.land})",
                        IconType = item.soort
                    };
                    CustomPins.Add(pin);
                }
                catch (NullReferenceException nre)
                {
                    Console.WriteLine(nre.Message);
                }
                catch (Exception ex)
                {

                }
            }
            locationsMap.CustomPins = CustomPins;
            foreach (var cpin in locationsMap.CustomPins)
            {
                locationsMap.Pins.Add(cpin);
            }
        }

CustomRenderer (Android)

    public class CustomMapRenderer : MapRenderer
    {
        List<CustomPin> customPins;
        public CustomMapRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(Xamarin.Forms.Platform.Android.ElementChangedEventArgs<Map> e)
        {
            base.OnElementChanged(e);

            if (e.OldElement != null)
            {
            }

            if (e.NewElement != null)
            {
                
            }
        }
        protected override MarkerOptions CreateMarker(Pin pin)
        {
            var marker = new MarkerOptions();
            marker.SetPosition(new LatLng(pin.Position.Latitude, pin.Position.Longitude));
            marker.SetTitle(pin.Label);
            marker.SetSnippet(pin.Address);
            var customPin = GetCustomPin(pin);
            if (customPin != null)
            {
                if(customPin.IconType == "corporate")
                {
                    marker.SetIcon(BitmapDescriptorFactory.FromResource(Resource.Drawable.corporate));
                }
                else if(customPin.IconType == "pickup")
                {
                    marker.SetIcon(BitmapDescriptorFactory.FromResource(Resource.Drawable.bus));
                } 
            }
           
            return marker;
        }


        CustomPin GetCustomPin(Pin pin)
        {
            var position = pin.Position;
            foreach (var cpin in customPins)
            {
                if (cpin.Position == position)
                {
                    return cpin;
                }
            }
            return null;
        }
    }
}

此问题的解决方案是直接select 地图元素的 Custompins 属性 将正确的 CustomPin 与默认 Pins 配对。

protected override MarkerOptions CreateMarker(Pin pin)
    {
        var marker = new MarkerOptions();
        marker.SetPosition(new LatLng(pin.Position.Latitude, pin.Position.Longitude));
        marker.SetTitle(pin.Label);
        marker.SetSnippet(pin.Address);
        var customPin = (Element as CustomMap).CustomPins.FirstOrDefault(p => p.Position == pin.Position);
        if (customPin != null)
        {
            if (customPin.IconType == "corporate")
            {
                marker.SetIcon(BitmapDescriptorFactory.FromResource(Resource.Drawable.corporate));
            }
            else if (customPin.IconType == "pickup")
            {
                marker.SetIcon(BitmapDescriptorFactory.FromResource(Resource.Drawable.bus));
            }
        }

        return marker;
    }