如何在 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;
}
我正在尝试使用多个不同的自定义地图图钉渲染地图。
我已按照此处提供的文档将所有图标替换为自定义图标:
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;
}