最新版本的Xmarin.Forms.Maps打破了自定义渲染器

时间:2016-12-27 07:52:18

标签: xamarin xamarin.forms

尝试使用自定义渲染器在地图上显示圆圈。 (机器人)

将Xamarin.Forms.Maps更新为v2.3.3.175,现在我收到错误:CustomMapRenderer.OnElementChanged(ElementChangedEventArgs)':找不到合适的方法来覆盖。

以前没有遇到任何问题。即使是下面链接的样本也不再有效。 https://developer.xamarin.com/recipes/cross-platform/xamarin-forms/maps/map-overlay/circle/

ElementChangedEventArgs<View>更改为ElementChangedEventArgs<Map>会解决错误,但永远不会调用渲染器,因此圈子永远不会显示。

有什么想法吗?提前谢谢。

我的自定义Android渲染器:

using Android.Gms.Maps;
using Android.Gms.Maps.Model;
using Xamarin.Forms;
using Xamarin.Forms.Maps.Android;
using GasFinder;
using MapOverlay.Droid;

[assembly: ExportRenderer(typeof(CustomMap),typeof(CustomMapRenderer))]
namespace MapOverlay.Droid {
    public class CustomMapRenderer:MapRenderer, IOnMapReadyCallback {
    GoogleMap map;
    CustomCircle circle;

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

        if(e.OldElement != null) {
            // Unsubscribe
        }

        if(e.NewElement != null) {
            var formsMap = (CustomMap)e.NewElement;
            circle = formsMap.Circle;
            ((MapView)Control).GetMapAsync(this);
        }
    }
    public void OnMapReady(GoogleMap googleMap) {
        map = googleMap;

        var circleOptions = new CircleOptions();
        circleOptions.InvokeCenter(new LatLng(circle.Position.Latitude,circle.Position.Longitude));
        circleOptions.InvokeRadius(circle.Radius);
        circleOptions.InvokeFillColor(0X233273b1);
        circleOptions.InvokeStrokeColor(0X64007eff);
        circleOptions.InvokeStrokeWidth(10);
        map.AddCircle(circleOptions);
    }
}
}

CustomMap.cs如下:

using System.Collections.Generic;
using Xamarin.Forms.Maps;

namespace GasFinder {
    public class CustomMap:Map {
        public CustomCircle Circle { get; set; }
    }
}

CustomCircle.cs如下:

using Xamarin.Forms.Maps;

namespace GasFinder {
    public class CustomCircle {
        public Position Position { get; set; }
        public double Radius { get; set; }
    }
}

我的Page.xaml.cs上的代码如下:

var position = new Xamarin.Forms.Maps.Position(Search.loc.lat,Search.loc.lng);
customMap.Circle = new CustomCircle {
    Position = position,
    Radius = Settings.Distance*1000
};

1 个答案:

答案 0 :(得分:0)

使用Xamarin.Forms.Maps v2.3.3.193

protected override void OnElementChanged(ElementChangedEventArgs<Map> e) {
    base.OnElementChanged(e); 
    if(e.OldElement != null) { } 
    if(e.NewElement != null) { 
        var formsMap = (CustomMap)e.NewElement; 
        circle = formsMap.Circle; 
        ((MapView)Control).GetMapAsync(this); 
    } 
}